• Pavel Begunkov's avatar
    io_uring: reexpand under-reexpanded iters · 89c2b3b7
    Pavel Begunkov authored
    
    
    [   74.211232] BUG: KASAN: stack-out-of-bounds in iov_iter_revert+0x809/0x900
    [   74.212778] Read of size 8 at addr ffff888025dc78b8 by task
    syz-executor.0/828
    [   74.214756] CPU: 0 PID: 828 Comm: syz-executor.0 Not tainted
    5.14.0-rc3-next-20210730 #1
    [   74.216525] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
    BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014
    [   74.219033] Call Trace:
    [   74.219683]  dump_stack_lvl+0x8b/0xb3
    [   74.220706]  print_address_description.constprop.0+0x1f/0x140
    [   74.224226]  kasan_report.cold+0x7f/0x11b
    [   74.226085]  iov_iter_revert+0x809/0x900
    [   74.227960]  io_write+0x57d/0xe40
    [   74.232647]  io_issue_sqe+0x4da/0x6a80
    [   74.242578]  __io_queue_sqe+0x1ac/0xe60
    [   74.245358]  io_submit_sqes+0x3f6e/0x76a0
    [   74.248207]  __do_sys_io_uring_enter+0x90c/0x1a20
    [   74.257167]  do_syscall_64+0x3b/0x90
    [   74.257984]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    old_size = iov_iter_count();
    ...
    iov_iter_revert(old_size - iov_iter_count());
    
    If iov_iter_revert() is done base on the initial size as above, and the
    iter is truncated and not reexpanded in the middle, it miscalculates
    borders causing problems. This trace is due to no one reexpanding after
    generic_write_checks().
    
    Now iters store how many bytes has been truncated, so reexpand them to
    the initial state right before reverting.
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarPalash Oswal <oswalpalash@gmail.com>
    Reported-by: default avatarSudip Mukherjee <sudipm.mukherjee@gmail.com>
    Reported-and-tested-by: syzbot+9671693590ef5aad8953@syzkaller.appspotmail.com
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    89c2b3b7
io_uring.c 251 KB