diff options
Diffstat (limited to 'net/core/rtnetlink.c')
| -rw-r--r-- | net/core/rtnetlink.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a466821d1441..0ec48403ed68 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -3047,6 +3047,7 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)  	u32 portid = NETLINK_CB(cb->skb).portid;  	u32 seq = cb->nlh->nlmsg_seq;  	u32 filter_mask = 0; +	int err;  	if (nlmsg_len(cb->nlh) > sizeof(struct ifinfomsg)) {  		struct nlattr *extfilt; @@ -3067,20 +3068,25 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)  		struct net_device *br_dev = netdev_master_upper_dev_get(dev);  		if (br_dev && br_dev->netdev_ops->ndo_bridge_getlink) { -			if (idx >= cb->args[0] && -			    br_dev->netdev_ops->ndo_bridge_getlink( -				    skb, portid, seq, dev, filter_mask, -				    NLM_F_MULTI) < 0) -				break; +			if (idx >= cb->args[0]) { +				err = br_dev->netdev_ops->ndo_bridge_getlink( +						skb, portid, seq, dev, +						filter_mask, NLM_F_MULTI); +				if (err < 0 && err != -EOPNOTSUPP) +					break; +			}  			idx++;  		}  		if (ops->ndo_bridge_getlink) { -			if (idx >= cb->args[0] && -			    ops->ndo_bridge_getlink(skb, portid, seq, dev, -						    filter_mask, -						    NLM_F_MULTI) < 0) -				break; +			if (idx >= cb->args[0]) { +				err = ops->ndo_bridge_getlink(skb, portid, +							      seq, dev, +							      filter_mask, +							      NLM_F_MULTI); +				if (err < 0 && err != -EOPNOTSUPP) +					break; +			}  			idx++;  		}  	}  |