提交 501cb02b 编写于 作者: J Jeff Dike 提交者: Linus Torvalds

[PATCH] uml: fix strace -f

It turns out that we need to check for pending signals when a newly forked
process is run for the first time.  With strace -f, strace needs to know about
the forked process before it gets going.  If it doesn't, then it ptraces some
bogus values into its registers, and the process segfaults.  So, I added calls
to interrupt_end, which does that, plus checks for reschedules.  There
shouldn't be any of those, but x86 does the same thing, so I'm copying that
behavior to be safe.
Signed-off-by: NJeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 da00d9a5
...@@ -68,8 +68,11 @@ void new_thread_handler(int sig) ...@@ -68,8 +68,11 @@ void new_thread_handler(int sig)
* 0 if it just exits * 0 if it just exits
*/ */
n = run_kernel_thread(fn, arg, &current->thread.exec_buf); n = run_kernel_thread(fn, arg, &current->thread.exec_buf);
if(n == 1) if(n == 1){
/* Handle any immediate reschedules or signals */
interrupt_end();
userspace(&current->thread.regs.regs); userspace(&current->thread.regs.regs);
}
else do_exit(0); else do_exit(0);
} }
...@@ -96,6 +99,8 @@ void fork_handler(int sig) ...@@ -96,6 +99,8 @@ void fork_handler(int sig)
schedule_tail(current->thread.prev_sched); schedule_tail(current->thread.prev_sched);
current->thread.prev_sched = NULL; current->thread.prev_sched = NULL;
/* Handle any immediate reschedules or signals */
interrupt_end();
userspace(&current->thread.regs.regs); userspace(&current->thread.regs.regs);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册