提交 25b1e679 编写于 作者: B Ben Hutchings 提交者: David S. Miller

net: Fix continued iteration in rtnl_bridge_getlink()

Commit e5a55a89 ('net: create generic
bridge ops') broke the handling of a non-zero starting index in
rtnl_bridge_getlink() (based on the old br_dump_ifinfo()).

When the starting index is non-zero, we need to increment the current
index for each entry that we are skipping.  Also, we need to check the
index before both cases, since we may previously have stopped
iteration between getting information about a device from its master
and from itself.
Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
Tested-by: NJohn Fastabend <john.r.fastabend@intel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 1a72418b
......@@ -2315,28 +2315,19 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)
const struct net_device_ops *ops = dev->netdev_ops;
struct net_device *master = dev->master;
if (idx < cb->args[0])
continue;
if (master && master->netdev_ops->ndo_bridge_getlink) {
const struct net_device_ops *bops = master->netdev_ops;
int err = bops->ndo_bridge_getlink(skb, portid,
seq, dev);
if (err < 0)
if (idx >= cb->args[0] &&
master->netdev_ops->ndo_bridge_getlink(
skb, portid, seq, dev) < 0)
break;
else
idx++;
idx++;
}
if (ops->ndo_bridge_getlink) {
int err = ops->ndo_bridge_getlink(skb, portid,
seq, dev);
if (err < 0)
if (idx >= cb->args[0] &&
ops->ndo_bridge_getlink(skb, portid, seq, dev) < 0)
break;
else
idx++;
idx++;
}
}
rcu_read_unlock();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册