| From 47a481532966d904cc890ef7163faf84898bb3aa Mon Sep 17 00:00:00 2001 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Wed, 22 Jan 2020 09:07:35 -0800 |
| Subject: [PATCH] tun: add mutex_unlock() call and napi.skb clearing in |
| tun_get_user() |
| |
| commit 1efba987c48629c0c64703bb4ea76ca1a3771d17 upstream. |
| |
| If both IFF_NAPI_FRAGS mode and XDP are enabled, and the XDP program |
| consumes the skb, we need to clear the napi.skb (or risk |
| a use-after-free) and release the mutex (or risk a deadlock) |
| |
| WARNING: lock held when returning to user space! |
| 5.5.0-rc6-syzkaller #0 Not tainted |
| ------------------------------------------------ |
| syz-executor.0/455 is leaving the kernel with locks still held! |
| 1 lock held by syz-executor.0/455: |
| #0: ffff888098f6e748 (&tfile->napi_mutex){+.+.}, at: tun_get_user+0x1604/0x3fc0 drivers/net/tun.c:1835 |
| |
| Fixes: 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver") |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Reported-by: syzbot <syzkaller@googlegroups.com> |
| Cc: Petar Penkov <ppenkov@google.com> |
| Cc: Willem de Bruijn <willemb@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/tun.c b/drivers/net/tun.c |
| index 34b0e1416525..bead09f37ebd 100644 |
| --- a/drivers/net/tun.c |
| +++ b/drivers/net/tun.c |
| @@ -1937,6 +1937,10 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, |
| if (ret != XDP_PASS) { |
| rcu_read_unlock(); |
| local_bh_enable(); |
| + if (frags) { |
| + tfile->napi.skb = NULL; |
| + mutex_unlock(&tfile->napi_mutex); |
| + } |
| return total_len; |
| } |
| } |
| -- |
| 2.7.4 |
| |