x86-64: Don't use pointer to out-of-scope variable in dump_trace()
authorJesper Juhl <jj@chaosbits.net>
Mon, 24 Jan 2011 21:41:11 +0000 (22:41 +0100)
committerH. Peter Anvin <hpa@linux.intel.com>
Mon, 24 Jan 2011 21:46:15 +0000 (13:46 -0800)
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: Jesper Juhl <jj@chaosbits.net>
LKML-Reference: <alpine.LNX.2.00.1101242232590.10252@swampdragon.chaosbits.net>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/kernel/dumpstack_64.c

index 64101335de19aad09ec03d75dea8260b28051747..a6b6fcf7f0aee9665e00fc2ed8d8d9290fc0423a 100644 (file)
@@ -149,13 +149,13 @@ void dump_trace(struct task_struct *task,
        unsigned used = 0;
        struct thread_info *tinfo;
        int graph = 0;
+       unsigned long dummy;
        unsigned long bp;
 
        if (!task)
                task = current;
 
        if (!stack) {
-               unsigned long dummy;
                stack = &dummy;
                if (task && task != current)
                        stack = (unsigned long *)task->thread.sp;