• Daniel Axtens's avatar
    kernel/relay.c: handle alloc_percpu returning NULL in relay_open · 54e200ab
    Daniel Axtens authored
    alloc_percpu() may return NULL, which means chan->buf may be set to NULL.
    In that case, when we do *per_cpu_ptr(chan->buf, ...), we dereference an
    invalid pointer:
    
      BUG: Unable to handle kernel data access at 0x7dae0000
      Faulting instruction address: 0xc0000000003f3fec
      ...
      NIP relay_open+0x29c/0x600
      LR relay_open+0x270/0x600
      Call Trace:
         relay_open+0x264/0x600 (unreliable)
         __blk_trace_setup+0x254/0x600
         blk_trace_setup+0x68/0xa0
         sg_ioctl+0x7bc/0x2e80
         do_vfs_ioctl+0x13c/0x1300
         ksys_ioctl+0x94/0x130
         sys_ioctl+0x48/0xb0
         system_call+0x5c/0x68
    
    Check if alloc_percpu returns NULL.
    
    This was found by syzkaller both on x86 and powerpc, and the reproducer
    it found on powerpc is capable of hitting the issue as an unprivileged
    user.
    
    Fixes: 017c59c0 ("relay: Use per CPU constructs for the relay channel buffer pointers")
    Reported-by: syzbot+1e925b4b836afe85a1c6@syzkaller-ppc64.appspotmail.com
    Reported-by: syzbot+587b2421926808309d21@syzkaller-ppc64.appspotmail.com
    Reported-by: syzbot+58320b7171734bf79d26@syzkaller.appspotmail.com
    Reported-by: syzbot+d6074fb08bdb2e010520@syzkaller.appspotmail.com
    Signed-off-by: default avatarDaniel Axtens <dja@axtens.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Reviewed-by: default avatarAndrew Donnellan <ajd@linux.ibm.com>
    Acked-by: default avatarDavid Rientjes <rientjes@google.com>
    Cc: Akash Goel <akash.goel@intel.com>
    Cc: Andrew Donnellan <ajd@linux.ibm.com>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Cc: Salvatore Bonaccorso <carnil@debian.org>
    Cc: <stable@vger.kernel.org>	[4.10+]
    Link: http://lkml.kernel.org/r/20191219121256.26480-1-dja@axtens.netSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    54e200ab
relay.c 32.2 KB