• Qian Cai's avatar
    slub: fix a crash with SLUB_DEBUG + KASAN_SW_TAGS · 6373dca1
    Qian Cai authored
    In process_slab(), "p = get_freepointer()" could return a tagged
    pointer, but "addr = page_address()" always return a native pointer.  As
    the result, slab_index() is messed up here,
    
        return (p - addr) / s->size;
    
    All other callers of slab_index() have the same situation where "addr"
    is from page_address(), so just need to untag "p".
    
        # cat /sys/kernel/slab/hugetlbfs_inode_cache/alloc_calls
    
        Unable to handle kernel paging request at virtual address 2bff808aa4856d48
        Mem abort info:
          ESR = 0x96000007
          Exception class = DABT (current EL), IL = 32 bits
          SET = 0, FnV = 0
          EA = 0, S1PTW = 0
        Data abort info:
          ISV = 0, ISS = 0x00000007
          CM = 0, WnR = 0
        swapper pgtable: 64k pages, 48-bit VAs, pgdp = 0000000002498338
        [2bff808aa4856d48] pgd=00000097fcfd0003, pud=00000097fcfd0003, pmd=00000097fca30003, pte=00e8008b24850712
        Internal error: Oops: 96000007 [#1] SMP
        CPU: 3 PID: 79210 Comm: read_all Tainted: G             L    5.0.0-rc7+ #84
        Hardware name: HPE Apollo 70             /C01_APACHE_MB         , BIOS L50_5.13_1.0.6 07/10/2018
        pstate: 00400089 (nzcv daIf +PAN -UAO)
        pc : get_map+0x78/0xec
        lr : get_map+0xa0/0xec
        sp : aeff808989e3f8e0
        x29: aeff808989e3f940 x28: ffff800826200000
        x27: ffff100012d47000 x26: 9700000000002500
        x25: 0000000000000001 x24: 52ff8008200131f8
        x23: 52ff8008200130a0 x22: 52ff800820013098
        x21: ffff800826200000 x20: ffff100013172ba0
        x19: 2bff808a8971bc00 x18: ffff1000148f5538
        x17: 000000000000001b x16: 00000000000000ff
        x15: ffff1000148f5000 x14: 00000000000000d2
        x13: 0000000000000001 x12: 0000000000000000
        x11: 0000000020000002 x10: 2bff808aa4856d48
        x9 : 0000020000000000 x8 : 68ff80082620ebb0
        x7 : 0000000000000000 x6 : ffff1000105da1dc
        x5 : 0000000000000000 x4 : 0000000000000000
        x3 : 0000000000000010 x2 : 2bff808a8971bc00
        x1 : ffff7fe002098800 x0 : ffff80082620ceb0
        Process read_all (pid: 79210, stack limit = 0x00000000f65b9361)
        Call trace:
         get_map+0x78/0xec
         process_slab+0x7c/0x47c
         list_locations+0xb0/0x3c8
         alloc_calls_show+0x34/0x40
         slab_attr_show+0x34/0x48
         sysfs_kf_seq_show+0x2e4/0x570
         kernfs_seq_show+0x12c/0x1a0
         seq_read+0x48c/0xf84
         kernfs_fop_read+0xd4/0x448
         __vfs_read+0x94/0x5d4
         vfs_read+0xcc/0x194
         ksys_read+0x6c/0xe8
         __arm64_sys_read+0x68/0xb0
         el0_svc_handler+0x230/0x3bc
         el0_svc+0x8/0xc
        Code: d3467d2a 9ac92329 8b0a0e6a f9800151 (c85f7d4b)
        ---[ end trace a383a9a44ff13176 ]---
        Kernel panic - not syncing: Fatal exception
        SMP: stopping secondary CPUs
        SMP: failed to stop secondary CPUs 1-7,32,40,127
        Kernel Offset: disabled
        CPU features: 0x002,20000c18
        Memory Limit: none
        ---[ end Kernel panic - not syncing: Fatal exception ]---
    
    Link: http://lkml.kernel.org/r/20190220020251.82039-1-cai@lca.pwSigned-off-by: default avatarQian Cai <cai@lca.pw>
    Reviewed-by: default avatarAndrey Konovalov <andreyknvl@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6373dca1
slub.c 143 KB