• Petr Mladek's avatar
    vsprintf: Do not break early boot with probing addresses · 2ac5a3bf
    Petr Mladek authored
    The commit 3e5903eb ("vsprintf: Prevent crash when dereferencing
    invalid pointers") broke boot on several architectures. The common
    pattern is that probe_kernel_read() is not working during early
    boot because userspace access framework is not ready.
    
    It is a generic problem. We have to avoid any complex external
    functions in vsprintf() code, especially in the common path.
    They might break printk() easily and are hard to debug.
    
    Replace probe_kernel_read() with some simple checks for obvious
    problems.
    
    Details:
    
    1. Report on Power:
    
    Kernel crashes very early during boot with with CONFIG_PPC_KUAP and
    CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG
    
    The problem is the combination of some new code called via printk(),
    check_pointer() which calls probe_kernel_read(). That then calls
    allow_user_access() (PPC_KUAP) and that uses mmu_has_feature() too early
    (before we've patched features). With the JUMP_LABEL debug enabled that
    causes us to call printk() & dump_stack() and we end up recursing and
    overflowing the stack.
    
    Because it happens so early you don't get any output, just an apparently
    dead system.
    
    The stack trace (which you don't see) is something like:
    
      ...
      dump_stack+0xdc
      probe_kernel_read+0x1a4
      check_pointer+0x58
      string+0x3c
      vsnprintf+0x1bc
      vscnprintf+0x20
      printk_safe_log_store+0x7c
      printk+0x40
      dump_stack_print_info+0xbc
      dump_stack+0x8
      probe_kernel_read+0x1a4
      probe_kernel_read+0x19c
      check_pointer+0x58
      string+0x3c
      vsnprintf+0x1bc
      vscnprintf+0x20
      vprintk_store+0x6c
      vprintk_emit+0xec
      vprintk_func+0xd4
      printk+0x40
      cpufeatures_process_feature+0xc8
      scan_cpufeatures_subnodes+0x380
      of_scan_flat_dt_subnodes+0xb4
      dt_cpu_ftrs_scan_callback+0x158
      of_scan_flat_dt+0xf0
      dt_cpu_ftrs_scan+0x3c
      early_init_devtree+0x360
      early_setup+0x9c
    
    2. Report on s390:
    
    vsnprintf invocations, are broken on s390. For example, the early boot
    output now looks like this where the first (efault) should be
    the linux_banner:
    
    [    0.099985] (efault)
    [    0.099985] setup: Linux is running as a z/VM guest operating system in 64-bit mode
    [    0.100066] setup: The maximum memory size is 8192MB
    [    0.100070] cma: Reserved 4 MiB at (efault)
    [    0.100100] numa: NUMA mode: (efault)
    
    The reason for this, is that the code assumes that
    probe_kernel_address() works very early. This however is not true on
    at least s390. Uaccess on KERNEL_DS works only after page tables have
    been setup on s390, which happens with setup_arch()->paging_init().
    
    Any probe_kernel_address() invocation before that will return -EFAULT.
    
    Fixes: 3e5903eb ("vsprintf: Prevent crash when dereferencing invalid pointers")
    Link: http://lkml.kernel.org/r/20190510084213.22149-1-pmladek@suse.com
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
    Cc: "Tobin C . Harding" <me@tobin.cc>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: linux-kernel@vger.kernel.org
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: linuxppc-dev@lists.ozlabs.org
    Cc: Russell Currey <ruscur@russell.cc>
    Cc: Christophe Leroy <christophe.leroy@c-s.fr>
    Cc: Stephen Rothwell <sfr@ozlabs.org>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: linux-arch@vger.kernel.org
    Cc: linux-s390@vger.kernel.org
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Petr Mladek <pmladek@suse.com>
    Reviewed-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    2ac5a3bf
vsprintf.c 79.1 KB