diff options
author | Alan Ott <alan@signal11.us> | 2012-11-29 19:25:10 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-30 18:19:24 +0100 |
commit | fcefbe9fcb3b0d72c91629f7fcf7ea09a46ab2c1 (patch) | |
tree | 7b68000fe15086df2037cf4dbb89242b77257a7f /net/mac802154 | |
parent | 6lowpan: consider checksum bytes in fragmentation threshold (diff) | |
download | linux-fcefbe9fcb3b0d72c91629f7fcf7ea09a46ab2c1.tar.xz linux-fcefbe9fcb3b0d72c91629f7fcf7ea09a46ab2c1.zip |
mac802154: fix memory leaks
kfree_skb() was not getting called in the case of some failures.
This was pointed out by Eric Dumazet.
Signed-off-by: Alan Ott <alan@signal11.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mac802154')
-rw-r--r-- | net/mac802154/tx.c | 5 | ||||
-rw-r--r-- | net/mac802154/wpan.c | 4 |
2 files changed, 7 insertions, 2 deletions
diff --git a/net/mac802154/tx.c b/net/mac802154/tx.c index 1a4df39c722e..db639140afc6 100644 --- a/net/mac802154/tx.c +++ b/net/mac802154/tx.c @@ -85,6 +85,7 @@ netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, if (!(priv->phy->channels_supported[page] & (1 << chan))) { WARN_ON(1); + kfree_skb(skb); return NETDEV_TX_OK; } @@ -103,8 +104,10 @@ netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, } work = kzalloc(sizeof(struct xmit_work), GFP_ATOMIC); - if (!work) + if (!work) { + kfree_skb(skb); return NETDEV_TX_BUSY; + } INIT_WORK(&work->work, mac802154_xmit_worker); work->skb = skb; diff --git a/net/mac802154/wpan.c b/net/mac802154/wpan.c index f30f6d4beea1..1191039c2b1b 100644 --- a/net/mac802154/wpan.c +++ b/net/mac802154/wpan.c @@ -327,8 +327,10 @@ mac802154_wpan_xmit(struct sk_buff *skb, struct net_device *dev) if (chan == MAC802154_CHAN_NONE || page >= WPAN_NUM_PAGES || - chan >= WPAN_NUM_CHANNELS) + chan >= WPAN_NUM_CHANNELS) { + kfree_skb(skb); return NETDEV_TX_OK; + } skb->skb_iif = dev->ifindex; dev->stats.tx_packets++; |