• Thomas Gleixner's avatar
    x86/dumpstack/64: Don't evaluate exception stacks before setup · e361362b
    Thomas Gleixner authored
    Cyrill reported the following crash:
    
      BUG: unable to handle page fault for address: 0000000000001ff0
      #PF: supervisor read access in kernel mode
      RIP: 0010:get_stack_info+0xb3/0x148
    
    It turns out that if the stack tracer is invoked before the exception stack
    mappings are initialized in_exception_stack() can erroneously classify an
    invalid address as an address inside of an exception stack:
    
        begin = this_cpu_read(cea_exception_stacks);  <- 0
        end = begin + sizeof(exception stacks);
    
    i.e. any address between 0 and end will be considered as exception stack
    address and the subsequent code will then try to derefence the resulting
    stack frame at a non mapped address.
    
     end = begin + (unsigned long)ep->size;
         ==> end = 0x2000
    
     regs = (struct pt_regs *)end - 1;
         ==> regs = 0x2000 - sizeof(struct pt_regs *) = 0x1ff0
    
     info->next_sp   = (unsigned long *)regs->sp;
         ==> Crashes due to accessing 0x1ff0
    
    Prevent this by checking the validity of the cea_exception_stack base
    address and bailing out if it is zero.
    
    Fixes: afcd21da ("x86/dumpstack/64: Use cpu_entry_area instead of orig_ist")
    Reported-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
    Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1910231950590.1852@nanos.tec.linutronix.de
    e361362b
dumpstack_64.c 4.78 KB