• Jens Axboe's avatar
    io_uring: always delete double poll wait entry on match · 8706e04e
    Jens Axboe authored
    syzbot reports a crash with tty polling, which is using the double poll
    handling:
    
    general protection fault, probably for non-canonical address 0xdffffc0000000009: 0000 [#1] PREEMPT SMP KASAN
    KASAN: null-ptr-deref in range [0x0000000000000048-0x000000000000004f]
    CPU: 0 PID: 6874 Comm: syz-executor749 Not tainted 5.9.0-rc6-next-20200924-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:io_poll_get_single fs/io_uring.c:4778 [inline]
    RIP: 0010:io_poll_double_wake+0x51/0x510 fs/io_uring.c:4845
    Code: fc ff df 48 c1 ea 03 80 3c 02 00 0f 85 9e 03 00 00 48 b8 00 00 00 00 00 fc ff df 49 8b 5d 08 48 8d 7b 48 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 06 0f 8e 63 03 00 00 0f b6 6b 48 bf 06 00 00
    RSP: 0018:ffffc90001c1fb70 EFLAGS: 00010006
    RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000000004
    RDX: 0000000000000009 RSI: ffffffff81d9b3ad RDI: 0000000000000048
    RBP: dffffc0000000000 R08: ffff8880a3cac798 R09: ffffc90001c1fc60
    R10: fffff52000383f73 R11: 0000000000000000 R12: 0000000000000004
    R13: ffff8880a3cac798 R14: ffff8880a3cac7a0 R15: 0000000000000004
    FS:  0000000001f98880(0000) GS:ffff8880ae400000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f18886916c0 CR3: 0000000094c5a000 CR4: 00000000001506f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     __wake_up_common+0x147/0x650 kernel/sched/wait.c:93
     __wake_up_common_lock+0xd0/0x130 kernel/sched/wait.c:123
     tty_ldisc_hangup+0x1cf/0x680 drivers/tty/tty_ldisc.c:735
     __tty_hangup.part.0+0x403/0x870 drivers/tty/tty_io.c:625
     __tty_hangup drivers/tty/tty_io.c:575 [inline]
     tty_vhangup+0x1d/0x30 drivers/tty/tty_io.c:698
     pty_close+0x3f5/0x550 drivers/tty/pty.c:79
     tty_release+0x455/0xf60 drivers/tty/tty_io.c:1679
     __fput+0x285/0x920 fs/file_table.c:281
     task_work_run+0xdd/0x190 kernel/task_work.c:141
     tracehook_notify_resume include/linux/tracehook.h:188 [inline]
     exit_to_user_mode_loop kernel/entry/common.c:165 [inline]
     exit_to_user_mode_prepare+0x1e2/0x1f0 kernel/entry/common.c:192
     syscall_exit_to_user_mode+0x7a/0x2c0 kernel/entry/common.c:267
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x401210
    
    which is due to a failure in removing the double poll wait entry if we
    hit a wakeup match. This can cause multiple invocations of the wakeup,
    which isn't safe.
    
    Cc: stable@vger.kernel.org # v5.8
    Reported-by: syzbot+81b3883093f772addf6d@syzkaller.appspotmail.com
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    8706e04e
io_uring.c 213 KB