浏览代码

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
Linus Torvalds 15 年之前
父节点
当前提交
34388d1c4f
共有 1 个文件被更改,包括 6 次插入2 次删除
  1. 6 2
      arch/x86/kernel/dumpstack.h

+ 6 - 2
arch/x86/kernel/dumpstack.h

@@ -14,6 +14,8 @@
 #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
 #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
 #endif
 #endif
 
 
+#include <linux/uaccess.h>
+
 extern void
 extern void
 show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
 show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
 		unsigned long *stack, unsigned long bp, char *log_lvl);
 		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);
 	get_bp(frame);
 
 
 #ifdef CONFIG_FRAME_POINTER
 #ifdef CONFIG_FRAME_POINTER
-	while (n--)
-		frame = frame->next_frame;
+	while (n--) {
+		if (probe_kernel_address(&frame->next_frame, frame))
+			break;
+	}
 #endif
 #endif
 
 
 	return (unsigned long)frame;
 	return (unsigned long)frame;