aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Lindner <lindner_marek@yahoo.de>2010-02-19 10:18:10 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-03 19:43:03 -0500
commitda6d6c7ac366ad3189e494cd78376db7a4f40d59 (patch)
treed74f8a2adc3027b2c161e164c605954cffd34778
parent8d03847c090b12694fb9fa81dbefa7b3e4f10f1d (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.c16
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
502err_free: 504err_free:
503 kfree_skb(skb); 505 kfree_skb(skb);
504 return NET_RX_DROP; 506err_out:
505 507 return NET_RX_DROP;
506} 508}
507 509
508 510