Commit da6d6c7a authored by Marek Lindner's avatar Marek Lindner Committed by Greg Kroah-Hartman

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: default avatarMarek Lindner <lindner_marek@yahoo.de>
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8d03847c
...@@ -426,10 +426,11 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -426,10 +426,11 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
struct net_device_stats *stats; struct net_device_stats *stats;
int ret; int ret;
skb = skb_share_check(skb, GFP_ATOMIC); skb = skb_share_check(skb, GFP_ATOMIC);
if (skb == NULL) /* skb was released by skb_share_check() */
goto err_free; if (!skb)
goto err_out;
/* packet should hold at least type and version */ /* packet should hold at least type and version */
if (unlikely(skb_headlen(skb) < 2)) if (unlikely(skb_headlen(skb) < 2))
...@@ -444,7 +445,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -444,7 +445,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
if (!batman_if) if (!batman_if)
goto err_free; 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) { if (stats) {
stats->rx_packets++; stats->rx_packets++;
stats->rx_bytes += skb->len; stats->rx_bytes += skb->len;
...@@ -490,6 +491,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -490,6 +491,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
default: default:
ret = NET_RX_DROP; ret = NET_RX_DROP;
} }
if (ret == NET_RX_DROP) if (ret == NET_RX_DROP)
kfree_skb(skb); kfree_skb(skb);
...@@ -500,9 +502,9 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -500,9 +502,9 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
return NET_RX_SUCCESS; return NET_RX_SUCCESS;
err_free: err_free:
kfree_skb(skb); kfree_skb(skb);
return NET_RX_DROP; err_out:
return NET_RX_DROP;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment