• Matthew Wilcox (Oracle)'s avatar
    XArray: Fix xas_create_range() when multi-order entry present · 3e3c6580
    Matthew Wilcox (Oracle) authored
    If there is already an entry present that is of order >= XA_CHUNK_SHIFT
    when we call xas_create_range(), xas_create_range() will misinterpret
    that entry as a node and dereference xa_node->parent, generally leading
    to a crash that looks something like this:
    
    general protection fault, probably for non-canonical address 0xdffffc0000000001:
    0000 [#1] PREEMPT SMP KASAN
    KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
    CPU: 0 PID: 32 Comm: khugepaged Not tainted 5.17.0-rc8-syzkaller-00003-g56e337f2 #0
    RIP: 0010:xa_parent_locked include/linux/xarray.h:1207 [inline]
    RIP: 0010:xas_create_range+0x2d9/0x6e0 lib/xarray.c:725
    
    It's deterministically reproducable once you know what the problem is,
    but producing it in a live kernel requires khugepaged to hit a race.
    While the problem has been present since xas_create_range() was
    introduced, I'm not aware of a way to hit it before the page cache was
    converted to use multi-index entries.
    
    Fixes: 6b24ca4a ("mm: Use multi-index entries in the page cache")
    Reported-by: syzbot+0d2b0bf32ca5cfd09f2e@syzkaller.appspotmail.com
    Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    3e3c6580
xarray.c 58.6 KB