• Jesper Juhl's avatar
    x86-64: Don't use pointer to out-of-scope variable in dump_trace() · 2e5aa682
    Jesper Juhl authored
    In arch/x86/kernel/dumpstack_64.c::dump_trace() we have this code:
    
    ...
      		if (!stack) {
      			unsigned long dummy;
      			stack = &dummy;
      			if (task && task != current)
      				stack = (unsigned long *)task->thread.sp;
      		}
    
      		bp = stack_frame(task, regs);
      		/*
      		 * Print function call entries in all stacks, starting at the
      		 * current stack address. If the stacks consist of nested
      		 * exceptions
      		 */
      		tinfo = task_thread_info(task);
    
      		for (;;) {
      			char *id;
      			unsigned long *estack_end;
      			estack_end = in_exception_stack(cpu, (unsigned long)stack,
      							&used, &id);
    ...
    
    You'll notice that we assign to 'stack' the address of the variable
    'dummy' which is only in-scope inside the 'if (!stack)'. So when we later
    access stack (at the end of the above, and assuming we did not take the
    'if (task && task != current)' branch) we'll be using the address of a
    variable that is no longer in scope. I believe this patch is the proper
    fix, but I freely admit that I'm not 100% certain.
    Signed-off-by: default avatarJesper Juhl <jj@chaosbits.net>
    LKML-Reference: <alpine.LNX.2.00.1101242232590.10252@swampdragon.chaosbits.net>
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    2e5aa682
dumpstack_64.c 8.2 KB