diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-20 09:20:23 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-20 09:20:23 -0700 |
commit | 34388d1c4feae50d61d6f4ec7594b9076d6d24db (patch) | |
tree | 3c586aaae3d88c2cd0ce4d78300377935d7ea9cb /arch | |
parent | 186837ca3a6dd6b422a5ea316ed38eea183dca5d (diff) | |
parent | ab285f2b5290d92b7ec1a6f9aad54308dadf6157 (diff) |
Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
perf: Fix unsafe frame rewinding with hot regs fetching
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/dumpstack.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/x86/kernel/dumpstack.h b/arch/x86/kernel/dumpstack.h index e39e77168a37..e1a93be4fd44 100644 --- a/arch/x86/kernel/dumpstack.h +++ b/arch/x86/kernel/dumpstack.h @@ -14,6 +14,8 @@ #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) #endif +#include <linux/uaccess.h> + extern void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, unsigned long *stack, unsigned long bp, char *log_lvl); @@ -42,8 +44,10 @@ static inline unsigned long rewind_frame_pointer(int n) get_bp(frame); #ifdef CONFIG_FRAME_POINTER - while (n--) - frame = frame->next_frame; + while (n--) { + if (probe_kernel_address(&frame->next_frame, frame)) + break; + } #endif return (unsigned long)frame; |