Skip to content

Commit fbf9227

Browse files
Girish Moodalbailgregkh
authored andcommitted
tap: double-free in error path in tap_open()
[ Upstream commit 78e0ea6 ] Double free of skb_array in tap module is causing kernel panic. When tap_set_queue() fails we free skb_array right away by calling skb_array_cleanup(). However, later on skb_array_cleanup() is called again by tap_sock_destruct through sock_put(). This patch fixes that issue. Fixes: 362899b (macvtap: switch to use skb array) Signed-off-by: Girish Moodalbail <girish.moodalbail@oracle.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 62de3fe commit fbf9227

1 file changed

Lines changed: 9 additions & 9 deletions

File tree

drivers/net/macvtap.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,10 @@ static int macvtap_open(struct inode *inode, struct file *file)
559559
&macvtap_proto, 0);
560560
if (!q)
561561
goto err;
562+
if (skb_array_init(&q->skb_array, dev->tx_queue_len, GFP_KERNEL)) {
563+
sk_free(&q->sk);
564+
goto err;
565+
}
562566

563567
RCU_INIT_POINTER(q->sock.wq, &q->wq);
564568
init_waitqueue_head(&q->wq.wait);
@@ -582,22 +586,18 @@ static int macvtap_open(struct inode *inode, struct file *file)
582586
if ((dev->features & NETIF_F_HIGHDMA) && (dev->features & NETIF_F_SG))
583587
sock_set_flag(&q->sk, SOCK_ZEROCOPY);
584588

585-
err = -ENOMEM;
586-
if (skb_array_init(&q->skb_array, dev->tx_queue_len, GFP_KERNEL))
587-
goto err_array;
588-
589589
err = macvtap_set_queue(dev, file, q);
590-
if (err)
591-
goto err_queue;
590+
if (err) {
591+
/* macvtap_sock_destruct() will take care of freeing skb_array */
592+
goto err_put;
593+
}
592594

593595
dev_put(dev);
594596

595597
rtnl_unlock();
596598
return err;
597599

598-
err_queue:
599-
skb_array_cleanup(&q->skb_array);
600-
err_array:
600+
err_put:
601601
sock_put(&q->sk);
602602
err:
603603
if (dev)

0 commit comments

Comments
 (0)