summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2003-11-10 23:05:06 +0000
committerjdike <jdike>2003-11-10 23:05:06 +0000
commit37ff1732487e781466189ed06fd69d04ca09fb33 (patch)
tree83b8a2213bf5e19842ee5a8f51f8537b82fa0414
parent5cc4d5b78d8415fab42b9e2b1975701f5dbe3065 (diff)
downloaduml-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.c6
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);