Staging: batman-adv: avoid crash on memory allocation error
authorMarek Lindner <lindner_marek@yahoo.de>
Fri, 19 Feb 2010 15:18:10 +0000 (16:18 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 4 Mar 2010 00:43:03 +0000 (16:43 -0800)
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>
drivers/staging/batman-adv/hard-interface.c

index f8b1ba3..0f94158 100644 (file)
@@ -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;
 }