]> rtime.felk.cvut.cz Git - lisovros/linux_canprio.git/blobdiff - drivers/staging/batman-adv/hard-interface.c
Staging: batman-adv: avoid crash on memory allocation error
[lisovros/linux_canprio.git] / drivers / staging / batman-adv / hard-interface.c
index f8b1ba3910ade77ec9fa55f5ad9d6debfa748795..0f94158b2660ee0d90cedcf8cdba853cbe05659c 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;
 }