diff options
Diffstat (limited to 'net/decnet/dn_dev.c')
-rw-r--r-- | net/decnet/dn_dev.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 88ea7a13bb24..01861feb608d 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
@@ -746,20 +746,23 @@ rtattr_failure: | |||
746 | static void rtmsg_ifa(int event, struct dn_ifaddr *ifa) | 746 | static void rtmsg_ifa(int event, struct dn_ifaddr *ifa) |
747 | { | 747 | { |
748 | struct sk_buff *skb; | 748 | struct sk_buff *skb; |
749 | int size = NLMSG_SPACE(sizeof(struct ifaddrmsg)+128); | 749 | int payload = sizeof(struct ifaddrmsg) + 128; |
750 | int err = -ENOBUFS; | ||
750 | 751 | ||
751 | skb = alloc_skb(size, GFP_KERNEL); | 752 | skb = alloc_skb(nlmsg_total_size(payload), GFP_KERNEL); |
752 | if (!skb) { | 753 | if (skb == NULL) |
753 | netlink_set_err(rtnl, 0, RTNLGRP_DECnet_IFADDR, ENOBUFS); | 754 | goto errout; |
754 | return; | 755 | |
755 | } | 756 | err = dn_dev_fill_ifaddr(skb, ifa, 0, 0, event, 0); |
756 | if (dn_dev_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) { | 757 | if (err < 0) { |
757 | kfree_skb(skb); | 758 | kfree_skb(skb); |
758 | netlink_set_err(rtnl, 0, RTNLGRP_DECnet_IFADDR, EINVAL); | 759 | goto errout; |
759 | return; | ||
760 | } | 760 | } |
761 | NETLINK_CB(skb).dst_group = RTNLGRP_DECnet_IFADDR; | 761 | |
762 | netlink_broadcast(rtnl, skb, 0, RTNLGRP_DECnet_IFADDR, GFP_KERNEL); | 762 | err = rtnl_notify(skb, 0, RTNLGRP_DECnet_IFADDR, NULL, GFP_KERNEL); |
763 | errout: | ||
764 | if (err < 0) | ||
765 | rtnl_set_sk_err(RTNLGRP_DECnet_IFADDR, err); | ||
763 | } | 766 | } |
764 | 767 | ||
765 | static int dn_dev_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | 768 | static int dn_dev_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) |