diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/rtnetlink.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 64ad17d077ed..8db72ac88feb 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1198,6 +1198,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1198 | struct hlist_head *head; | 1198 | struct hlist_head *head; |
1199 | struct nlattr *tb[IFLA_MAX+1]; | 1199 | struct nlattr *tb[IFLA_MAX+1]; |
1200 | u32 ext_filter_mask = 0; | 1200 | u32 ext_filter_mask = 0; |
1201 | int err; | ||
1201 | 1202 | ||
1202 | s_h = cb->args[0]; | 1203 | s_h = cb->args[0]; |
1203 | s_idx = cb->args[1]; | 1204 | s_idx = cb->args[1]; |
@@ -1218,11 +1219,17 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1218 | hlist_for_each_entry_rcu(dev, head, index_hlist) { | 1219 | hlist_for_each_entry_rcu(dev, head, index_hlist) { |
1219 | if (idx < s_idx) | 1220 | if (idx < s_idx) |
1220 | goto cont; | 1221 | goto cont; |
1221 | if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, | 1222 | err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, |
1222 | NETLINK_CB(cb->skb).portid, | 1223 | NETLINK_CB(cb->skb).portid, |
1223 | cb->nlh->nlmsg_seq, 0, | 1224 | cb->nlh->nlmsg_seq, 0, |
1224 | NLM_F_MULTI, | 1225 | NLM_F_MULTI, |
1225 | ext_filter_mask) <= 0) | 1226 | ext_filter_mask); |
1227 | /* If we ran out of room on the first message, | ||
1228 | * we're in trouble | ||
1229 | */ | ||
1230 | WARN_ON((err == -EMSGSIZE) && (skb->len == 0)); | ||
1231 | |||
1232 | if (err <= 0) | ||
1226 | goto out; | 1233 | goto out; |
1227 | 1234 | ||
1228 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | 1235 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); |