diff options
author | Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> | 2018-07-13 13:24:38 +0900 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-07-16 13:38:29 -0700 |
commit | 6e8cfd6d9d8049e2fd5b2de8a328519dc58ea1e6 (patch) | |
tree | 29bab783321200f51b5e37d0f6c22bb78c873890 /drivers | |
parent | 9f80a0723bf0401da63b75709a0e3f31cd4b9446 (diff) | |
download | linux-stable-6e8cfd6d9d8049e2fd5b2de8a328519dc58ea1e6.tar.gz linux-stable-6e8cfd6d9d8049e2fd5b2de8a328519dc58ea1e6.tar.bz2 linux-stable-6e8cfd6d9d8049e2fd5b2de8a328519dc58ea1e6.zip |
tun: Fix use-after-free on XDP_TX
On XDP_TX we need to free up the frame only when tun_xdp_tx() returns a
negative value. A positive value indicates that the packet is
successfully enqueued to the ptr_ring, so freeing the page causes
use-after-free.
Fixes: 735fc4054b3a ("xdp: change ndo_xdp_xmit API to support bulking")
Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Acked-by: Jason Wang <jasowang@redhat.com>
Acked-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/tun.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index a192a017cc68..f5727baac84a 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1688,7 +1688,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, case XDP_TX: get_page(alloc_frag->page); alloc_frag->offset += buflen; - if (tun_xdp_tx(tun->dev, &xdp)) + if (tun_xdp_tx(tun->dev, &xdp) < 0) goto err_redirect; rcu_read_unlock(); local_bh_enable(); |