Commit d5a26017 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] i386/x86-64: Add user_mode checks to profile_pc for oprofile

Fixes a obscure user space triggerable crash during oprofiling.

Oprofile calls profile_pc from NMIs even when user_mode(regs) is not true and
the program counter is inside the kernel lock section. This opens
a race - when a user program jumps to a kernel lock address and
a NMI happens before the illegal page fault exception is raised
and the program has a unmapped esp or ebp then the kernel could
oops. NMIs have a higher priority than exceptions so that could
happen.

Add user_mode checks to i386/x86-64 profile_pc to prevent that.

Cc: John Levon <levon@movementarian.org>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 5d2edfe0
...@@ -135,7 +135,7 @@ unsigned long profile_pc(struct pt_regs *regs) ...@@ -135,7 +135,7 @@ unsigned long profile_pc(struct pt_regs *regs)
{ {
unsigned long pc = instruction_pointer(regs); unsigned long pc = instruction_pointer(regs);
if (in_lock_functions(pc)) if (!user_mode_vm(regs) && in_lock_functions(pc))
return *(unsigned long *)(regs->ebp + 4); return *(unsigned long *)(regs->ebp + 4);
return pc; return pc;
......
...@@ -193,7 +193,7 @@ unsigned long profile_pc(struct pt_regs *regs) ...@@ -193,7 +193,7 @@ unsigned long profile_pc(struct pt_regs *regs)
is just accounted to the spinlock function. is just accounted to the spinlock function.
Better would be to write these functions in assembler again Better would be to write these functions in assembler again
and check exactly. */ and check exactly. */
if (in_lock_functions(pc)) { if (!user_mode(regs) && in_lock_functions(pc)) {
char *v = *(char **)regs->rsp; char *v = *(char **)regs->rsp;
if ((v >= _stext && v <= _etext) || if ((v >= _stext && v <= _etext) ||
(v >= _sinittext && v <= _einittext) || (v >= _sinittext && v <= _einittext) ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment