diff options
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r-- | net/core/rtnetlink.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index e76539a5eb5e..9bf9ae05f157 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -320,7 +320,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
320 | 320 | ||
321 | nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags); | 321 | nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags); |
322 | if (nlh == NULL) | 322 | if (nlh == NULL) |
323 | return -ENOBUFS; | 323 | return -EMSGSIZE; |
324 | 324 | ||
325 | ifm = nlmsg_data(nlh); | 325 | ifm = nlmsg_data(nlh); |
326 | ifm->ifi_family = AF_UNSPEC; | 326 | ifm->ifi_family = AF_UNSPEC; |
@@ -384,7 +384,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
384 | return nlmsg_end(skb, nlh); | 384 | return nlmsg_end(skb, nlh); |
385 | 385 | ||
386 | nla_put_failure: | 386 | nla_put_failure: |
387 | return nlmsg_cancel(skb, nlh); | 387 | nlmsg_cancel(skb, nlh); |
388 | return -EMSGSIZE; | ||
388 | } | 389 | } |
389 | 390 | ||
390 | static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | 391 | static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) |
@@ -633,9 +634,12 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
633 | 634 | ||
634 | err = rtnl_fill_ifinfo(nskb, dev, iw, iw_buf_len, RTM_NEWLINK, | 635 | err = rtnl_fill_ifinfo(nskb, dev, iw, iw_buf_len, RTM_NEWLINK, |
635 | NETLINK_CB(skb).pid, nlh->nlmsg_seq, 0, 0); | 636 | NETLINK_CB(skb).pid, nlh->nlmsg_seq, 0, 0); |
636 | /* failure impilies BUG in if_nlmsg_size or wireless_rtnetlink_get */ | 637 | if (err < 0) { |
637 | BUG_ON(err < 0); | 638 | /* -EMSGSIZE implies BUG in if_nlmsg_size */ |
638 | 639 | WARN_ON(err == -EMSGSIZE); | |
640 | kfree_skb(nskb); | ||
641 | goto errout; | ||
642 | } | ||
639 | err = rtnl_unicast(nskb, NETLINK_CB(skb).pid); | 643 | err = rtnl_unicast(nskb, NETLINK_CB(skb).pid); |
640 | errout: | 644 | errout: |
641 | kfree(iw_buf); | 645 | kfree(iw_buf); |
@@ -678,9 +682,12 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) | |||
678 | goto errout; | 682 | goto errout; |
679 | 683 | ||
680 | err = rtnl_fill_ifinfo(skb, dev, NULL, 0, type, 0, 0, change, 0); | 684 | err = rtnl_fill_ifinfo(skb, dev, NULL, 0, type, 0, 0, change, 0); |
681 | /* failure implies BUG in if_nlmsg_size() */ | 685 | if (err < 0) { |
682 | BUG_ON(err < 0); | 686 | /* -EMSGSIZE implies BUG in if_nlmsg_size() */ |
683 | 687 | WARN_ON(err == -EMSGSIZE); | |
688 | kfree_skb(skb); | ||
689 | goto errout; | ||
690 | } | ||
684 | err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); | 691 | err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); |
685 | errout: | 692 | errout: |
686 | if (err < 0) | 693 | if (err < 0) |