[PATCH 7/8] Staging: batman-adv: avoid crash on memory allocation error

Andrew Lunn andrew at lunn.ch
Fri Feb 19 15:18:10 UTC 2010


From: Marek Lindner <lindner_marek at yahoo.de>

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 at yahoo.de>
Signed-off-by: Andrew Lunn <andrew at lunn.ch>
---
 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 f8b1ba3..0f94158 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,
 	struct net_device_stats *stats;
 	int ret;
 
-    skb = skb_share_check(skb, GFP_ATOMIC);
+	skb = skb_share_check(skb, GFP_ATOMIC);
 
-    if (skb == NULL)
-		goto err_free;
+	/* skb was released by skb_share_check() */
+	if (!skb)
+		goto err_out;
 
 	/* packet should hold at least type and version */
 	if (unlikely(skb_headlen(skb) < 2))
@@ -444,7 +445,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 	if (!batman_if)
 		goto err_free;
 
-    stats = (struct net_device_stats *) dev_get_stats(skb->dev);
+	stats = (struct net_device_stats *)dev_get_stats(skb->dev);
 	if (stats) {
 		stats->rx_packets++;
 		stats->rx_bytes += skb->len;
@@ -490,6 +491,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 	default:
 		ret = NET_RX_DROP;
 	}
+
 	if (ret == NET_RX_DROP)
 		kfree_skb(skb);
 
@@ -500,9 +502,9 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 	return NET_RX_SUCCESS;
 
 err_free:
-    kfree_skb(skb);
-    return NET_RX_DROP;
-
+	kfree_skb(skb);
+err_out:
+	return NET_RX_DROP;
 }
 
 
-- 
1.6.6.2




More information about the devel mailing list