• Jens Axboe's avatar
    io_uring: free fixed_file_data after RCU grace period · c1e2148f
    Jens Axboe authored
    The percpu refcount protects this structure, and we can have an atomic
    switch in progress when exiting. This makes it unsafe to just free the
    struct normally, and can trigger the following KASAN warning:
    
    BUG: KASAN: use-after-free in percpu_ref_switch_to_atomic_rcu+0xfa/0x1b0
    Read of size 1 at addr ffff888181a19a30 by task swapper/0/0
    
    CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.6.0-rc4+ #5747
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014
    Call Trace:
     <IRQ>
     dump_stack+0x76/0xa0
     print_address_description.constprop.0+0x3b/0x60
     ? percpu_ref_switch_to_atomic_rcu+0xfa/0x1b0
     ? percpu_ref_switch_to_atomic_rcu+0xfa/0x1b0
     __kasan_report.cold+0x1a/0x3d
     ? percpu_ref_switch_to_atomic_rcu+0xfa/0x1b0
     percpu_ref_switch_to_atomic_rcu+0xfa/0x1b0
     rcu_core+0x370/0x830
     ? percpu_ref_exit+0x50/0x50
     ? rcu_note_context_switch+0x7b0/0x7b0
     ? run_rebalance_domains+0x11d/0x140
     __do_softirq+0x10a/0x3e9
     irq_exit+0xd5/0xe0
     smp_apic_timer_interrupt+0x86/0x200
     apic_timer_interrupt+0xf/0x20
     </IRQ>
    RIP: 0010:default_idle+0x26/0x1f0
    
    Fix this by punting the final exit and free of the struct to RCU, then
    we know that it's safe to do so. Jann suggested the approach of using a
    double rcu callback to achieve this. It's important that we do a nested
    call_rcu() callback, as otherwise the free could be ordered before the
    atomic switch, even if the latter was already queued.
    
    Reported-by: syzbot+e017e49c39ab484ac87a@syzkaller.appspotmail.com
    Suggested-by: default avatarJann Horn <jannh@google.com>
    Reviewed-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    c1e2148f
io_uring.c 170 KB