mirror of https://github.com/torvalds/linux.git
During socket release, sock_orphan() is called without considering that it
sets sk->sk_wq to NULL. Later, if SO_LINGER is enabled, this leads to a
null pointer dereferenced in virtio_transport_wait_close().
Orphan the socket only after transport release.
Partially reverts the 'Fixes:' commit.
KASAN: null-ptr-deref in range [0x0000000000000018-0x000000000000001f]
lock_acquire+0x19e/0x500
_raw_spin_lock_irqsave+0x47/0x70
add_wait_queue+0x46/0x230
virtio_transport_release+0x4e7/0x7f0
__vsock_release+0xfd/0x490
vsock_release+0x90/0x120
__sock_release+0xa3/0x250
sock_close+0x14/0x20
__fput+0x35e/0xa90
__x64_sys_close+0x78/0xd0
do_syscall_64+0x93/0x1b0
entry_SYSCALL_64_after_hwframe+0x76/0x7e
Reported-by: syzbot+9d55b199192a4be7d02c@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=9d55b199192a4be7d02c
Fixes:
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| af_vsock.c | ||
| af_vsock_tap.c | ||
| diag.c | ||
| hyperv_transport.c | ||
| virtio_transport.c | ||
| virtio_transport_common.c | ||
| vmci_transport.c | ||
| vmci_transport.h | ||
| vmci_transport_notify.c | ||
| vmci_transport_notify.h | ||
| vmci_transport_notify_qstate.c | ||
| vsock_addr.c | ||
| vsock_bpf.c | ||
| vsock_loopback.c | ||