diff options
author | jdike <jdike> | 2003-11-10 23:05:06 +0000 |
---|---|---|
committer | jdike <jdike> | 2003-11-10 23:05:06 +0000 |
commit | 37ff1732487e781466189ed06fd69d04ca09fb33 (patch) | |
tree | 83b8a2213bf5e19842ee5a8f51f8537b82fa0414 | |
parent | 5cc4d5b78d8415fab42b9e2b1975701f5dbe3065 (diff) | |
download | uml-history-37ff1732487e781466189ed06fd69d04ca09fb33.tar.gz |
Set SA_NODEFER for SIGSEGV, which should fix the process exiting problem
that Oleg has been seeing.
-rw-r--r-- | arch/um/kernel/process.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 00435c2..de00959 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -56,7 +56,11 @@ void init_new_thread_signals(int altstack) { int flags = altstack ? SA_ONSTACK : 0; - set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags, + /* NODEFER is set here because SEGV isn't turned back on when the + * handler is ready to receive signals. This causes any segfault + * during a copy_user to kill the process because the fault is blocked. + */ + set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags | SA_NODEFER, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); |