Skip to content

Commit

Permalink
macvlan: Fix leak and NULL dereference on error path
Browse files Browse the repository at this point in the history
The recent patch that moved broadcasts to process context added
a couple of bugs on the error path where we may dereference NULL
or leak an skb.  This patch fixes them.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Herbert Xu authored and David S. Miller committed Apr 23, 2014
1 parent 2abf967 commit e676f19
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions drivers/net/macvlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,25 +239,28 @@ static void macvlan_process_broadcast(struct work_struct *w)
static void macvlan_broadcast_enqueue(struct macvlan_port *port,
struct sk_buff *skb)
{
struct sk_buff *nskb;
int err = -ENOMEM;

skb = skb_clone(skb, GFP_ATOMIC);
if (!skb)
nskb = skb_clone(skb, GFP_ATOMIC);
if (!nskb)
goto err;

spin_lock(&port->bc_queue.lock);
if (skb_queue_len(&port->bc_queue) < skb->dev->tx_queue_len) {
__skb_queue_tail(&port->bc_queue, skb);
__skb_queue_tail(&port->bc_queue, nskb);
err = 0;
}
spin_unlock(&port->bc_queue.lock);

if (err)
goto err;
goto free_nskb;

schedule_work(&port->bc_work);
return;

free_nskb:
kfree_skb(nskb);
err:
atomic_long_inc(&skb->dev->rx_dropped);
}
Expand Down

0 comments on commit e676f19

Please sign in to comment.