Skip to content

Commit

Permalink
Staging: batman-adv: avoid crash on memory allocation error
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Marek Lindner authored and Greg Kroah-Hartman committed Mar 4, 2010
1 parent 8d03847 commit da6d6c7
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions drivers/staging/batman-adv/hard-interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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;
Expand Down Expand Up @@ -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);

Expand All @@ -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;
}


Expand Down

0 comments on commit da6d6c7

Please sign in to comment.