diff options
author | John Fastabend <john.r.fastabend@intel.com> | 2009-09-25 09:12:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-26 23:16:15 -0400 |
commit | 7eaf5077b37bb33dbd44e569ff88566d6fe286e9 (patch) | |
tree | 71029b598e5236463cf2a979926d9a98783e2558 /net | |
parent | 5dba93aedfc6906b27791c4a1136b177beae25b7 (diff) |
net: fix double skb free in dcbnl
netlink_unicast() calls kfree_skb even in the error case.
dcbnl calls netlink_unicast() which when it fails free's the
skb and returns an error value. dcbnl is free'ing the skb
again when this error occurs. This patch removes the double
free.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/dcb/dcbnl.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index e0879bfb7dd5..ac1205df6c86 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
@@ -194,7 +194,7 @@ static int dcbnl_reply(u8 value, u8 event, u8 cmd, u8 attr, u32 pid, | |||
194 | nlmsg_end(dcbnl_skb, nlh); | 194 | nlmsg_end(dcbnl_skb, nlh); |
195 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 195 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
196 | if (ret) | 196 | if (ret) |
197 | goto err; | 197 | return -EINVAL; |
198 | 198 | ||
199 | return 0; | 199 | return 0; |
200 | nlmsg_failure: | 200 | nlmsg_failure: |
@@ -275,7 +275,7 @@ static int dcbnl_getpfccfg(struct net_device *netdev, struct nlattr **tb, | |||
275 | 275 | ||
276 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 276 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
277 | if (ret) | 277 | if (ret) |
278 | goto err; | 278 | goto err_out; |
279 | 279 | ||
280 | return 0; | 280 | return 0; |
281 | nlmsg_failure: | 281 | nlmsg_failure: |
@@ -316,12 +316,11 @@ static int dcbnl_getperm_hwaddr(struct net_device *netdev, struct nlattr **tb, | |||
316 | 316 | ||
317 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 317 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
318 | if (ret) | 318 | if (ret) |
319 | goto err; | 319 | goto err_out; |
320 | 320 | ||
321 | return 0; | 321 | return 0; |
322 | 322 | ||
323 | nlmsg_failure: | 323 | nlmsg_failure: |
324 | err: | ||
325 | kfree_skb(dcbnl_skb); | 324 | kfree_skb(dcbnl_skb); |
326 | err_out: | 325 | err_out: |
327 | return -EINVAL; | 326 | return -EINVAL; |
@@ -383,7 +382,7 @@ static int dcbnl_getcap(struct net_device *netdev, struct nlattr **tb, | |||
383 | 382 | ||
384 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 383 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
385 | if (ret) | 384 | if (ret) |
386 | goto err; | 385 | goto err_out; |
387 | 386 | ||
388 | return 0; | 387 | return 0; |
389 | nlmsg_failure: | 388 | nlmsg_failure: |
@@ -460,7 +459,7 @@ static int dcbnl_getnumtcs(struct net_device *netdev, struct nlattr **tb, | |||
460 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 459 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
461 | if (ret) { | 460 | if (ret) { |
462 | ret = -EINVAL; | 461 | ret = -EINVAL; |
463 | goto err; | 462 | goto err_out; |
464 | } | 463 | } |
465 | 464 | ||
466 | return 0; | 465 | return 0; |
@@ -799,7 +798,7 @@ static int __dcbnl_pg_getcfg(struct net_device *netdev, struct nlattr **tb, | |||
799 | 798 | ||
800 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 799 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
801 | if (ret) | 800 | if (ret) |
802 | goto err; | 801 | goto err_out; |
803 | 802 | ||
804 | return 0; | 803 | return 0; |
805 | 804 | ||
@@ -1063,7 +1062,7 @@ static int dcbnl_bcn_getcfg(struct net_device *netdev, struct nlattr **tb, | |||
1063 | 1062 | ||
1064 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); | 1063 | ret = rtnl_unicast(dcbnl_skb, &init_net, pid); |
1065 | if (ret) | 1064 | if (ret) |
1066 | goto err; | 1065 | goto err_out; |
1067 | 1066 | ||
1068 | return 0; | 1067 | return 0; |
1069 | 1068 | ||