diff options
-rw-r--r-- | net/ipv4/devinet.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 309640e9ede1..80bf5b2ea2e6 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -1112,32 +1112,37 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa, | |||
1112 | { | 1112 | { |
1113 | struct ifaddrmsg *ifm; | 1113 | struct ifaddrmsg *ifm; |
1114 | struct nlmsghdr *nlh; | 1114 | struct nlmsghdr *nlh; |
1115 | unsigned char *b = skb->tail; | ||
1116 | 1115 | ||
1117 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); | 1116 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*ifm), flags); |
1118 | ifm = NLMSG_DATA(nlh); | 1117 | if (nlh == NULL) |
1118 | return -ENOBUFS; | ||
1119 | |||
1120 | ifm = nlmsg_data(nlh); | ||
1119 | ifm->ifa_family = AF_INET; | 1121 | ifm->ifa_family = AF_INET; |
1120 | ifm->ifa_prefixlen = ifa->ifa_prefixlen; | 1122 | ifm->ifa_prefixlen = ifa->ifa_prefixlen; |
1121 | ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT; | 1123 | ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT; |
1122 | ifm->ifa_scope = ifa->ifa_scope; | 1124 | ifm->ifa_scope = ifa->ifa_scope; |
1123 | ifm->ifa_index = ifa->ifa_dev->dev->ifindex; | 1125 | ifm->ifa_index = ifa->ifa_dev->dev->ifindex; |
1126 | |||
1124 | if (ifa->ifa_address) | 1127 | if (ifa->ifa_address) |
1125 | RTA_PUT(skb, IFA_ADDRESS, 4, &ifa->ifa_address); | 1128 | NLA_PUT_U32(skb, IFA_ADDRESS, ifa->ifa_address); |
1129 | |||
1126 | if (ifa->ifa_local) | 1130 | if (ifa->ifa_local) |
1127 | RTA_PUT(skb, IFA_LOCAL, 4, &ifa->ifa_local); | 1131 | NLA_PUT_U32(skb, IFA_LOCAL, ifa->ifa_local); |
1132 | |||
1128 | if (ifa->ifa_broadcast) | 1133 | if (ifa->ifa_broadcast) |
1129 | RTA_PUT(skb, IFA_BROADCAST, 4, &ifa->ifa_broadcast); | 1134 | NLA_PUT_U32(skb, IFA_BROADCAST, ifa->ifa_broadcast); |
1135 | |||
1130 | if (ifa->ifa_anycast) | 1136 | if (ifa->ifa_anycast) |
1131 | RTA_PUT(skb, IFA_ANYCAST, 4, &ifa->ifa_anycast); | 1137 | NLA_PUT_U32(skb, IFA_ANYCAST, ifa->ifa_anycast); |
1138 | |||
1132 | if (ifa->ifa_label[0]) | 1139 | if (ifa->ifa_label[0]) |
1133 | RTA_PUT(skb, IFA_LABEL, IFNAMSIZ, &ifa->ifa_label); | 1140 | NLA_PUT_STRING(skb, IFA_LABEL, ifa->ifa_label); |
1134 | nlh->nlmsg_len = skb->tail - b; | 1141 | |
1135 | return skb->len; | 1142 | return nlmsg_end(skb, nlh); |
1136 | 1143 | ||
1137 | nlmsg_failure: | 1144 | nla_put_failure: |
1138 | rtattr_failure: | 1145 | return nlmsg_cancel(skb, nlh); |
1139 | skb_trim(skb, b - skb->data); | ||
1140 | return -1; | ||
1141 | } | 1146 | } |
1142 | 1147 | ||
1143 | static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | 1148 | static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) |
@@ -1185,17 +1190,16 @@ done: | |||
1185 | 1190 | ||
1186 | static void rtmsg_ifa(int event, struct in_ifaddr* ifa) | 1191 | static void rtmsg_ifa(int event, struct in_ifaddr* ifa) |
1187 | { | 1192 | { |
1188 | int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + 128); | 1193 | struct sk_buff *skb; |
1189 | struct sk_buff *skb = alloc_skb(size, GFP_KERNEL); | ||
1190 | 1194 | ||
1191 | if (!skb) | 1195 | skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); |
1196 | if (skb == NULL) | ||
1192 | netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, ENOBUFS); | 1197 | netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, ENOBUFS); |
1193 | else if (inet_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) { | 1198 | else if (inet_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) { |
1194 | kfree_skb(skb); | 1199 | kfree_skb(skb); |
1195 | netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, EINVAL); | 1200 | netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, EINVAL); |
1196 | } else { | 1201 | } else |
1197 | netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_IFADDR, GFP_KERNEL); | 1202 | netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_IFADDR, GFP_KERNEL); |
1198 | } | ||
1199 | } | 1203 | } |
1200 | 1204 | ||
1201 | static struct rtnetlink_link inet_rtnetlink_table[RTM_NR_MSGTYPES] = { | 1205 | static struct rtnetlink_link inet_rtnetlink_table[RTM_NR_MSGTYPES] = { |