diff options
author | Marek Lindner <lindner_marek@yahoo.de> | 2010-02-19 10:18:10 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-03 19:43:03 -0500 |
commit | da6d6c7ac366ad3189e494cd78376db7a4f40d59 (patch) | |
tree | d74f8a2adc3027b2c161e164c605954cffd34778 | |
parent | 8d03847c090b12694fb9fa81dbefa7b3e4f10f1d (diff) |
Staging: batman-adv: avoid crash on memory allocation error
skb_share_check() returns NULL if it can't allocate more memory but
it still frees the skbuff.
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/batman-adv/hard-interface.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/staging/batman-adv/hard-interface.c b/drivers/staging/batman-adv/hard-interface.c index f8b1ba3910ad..0f94158b2660 100644 --- a/drivers/staging/batman-adv/hard-interface.c +++ b/drivers/staging/batman-adv/hard-interface.c | |||
@@ -426,10 +426,11 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
426 | struct net_device_stats *stats; | 426 | struct net_device_stats *stats; |
427 | int ret; | 427 | int ret; |
428 | 428 | ||
429 | skb = skb_share_check(skb, GFP_ATOMIC); | 429 | skb = skb_share_check(skb, GFP_ATOMIC); |
430 | 430 | ||
431 | if (skb == NULL) | 431 | /* skb was released by skb_share_check() */ |
432 | goto err_free; | 432 | if (!skb) |
433 | goto err_out; | ||
433 | 434 | ||
434 | /* packet should hold at least type and version */ | 435 | /* packet should hold at least type and version */ |
435 | if (unlikely(skb_headlen(skb) < 2)) | 436 | if (unlikely(skb_headlen(skb) < 2)) |
@@ -444,7 +445,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
444 | if (!batman_if) | 445 | if (!batman_if) |
445 | goto err_free; | 446 | goto err_free; |
446 | 447 | ||
447 | stats = (struct net_device_stats *) dev_get_stats(skb->dev); | 448 | stats = (struct net_device_stats *)dev_get_stats(skb->dev); |
448 | if (stats) { | 449 | if (stats) { |
449 | stats->rx_packets++; | 450 | stats->rx_packets++; |
450 | stats->rx_bytes += skb->len; | 451 | stats->rx_bytes += skb->len; |
@@ -490,6 +491,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
490 | default: | 491 | default: |
491 | ret = NET_RX_DROP; | 492 | ret = NET_RX_DROP; |
492 | } | 493 | } |
494 | |||
493 | if (ret == NET_RX_DROP) | 495 | if (ret == NET_RX_DROP) |
494 | kfree_skb(skb); | 496 | kfree_skb(skb); |
495 | 497 | ||
@@ -500,9 +502,9 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
500 | return NET_RX_SUCCESS; | 502 | return NET_RX_SUCCESS; |
501 | 503 | ||
502 | err_free: | 504 | err_free: |
503 | kfree_skb(skb); | 505 | kfree_skb(skb); |
504 | return NET_RX_DROP; | 506 | err_out: |
505 | 507 | return NET_RX_DROP; | |
506 | } | 508 | } |
507 | 509 | ||
508 | 510 | ||