diff -u um-linux-2.4.27-paolo/arch/um/kernel/process.c um-linux-2.4.27-paolo/arch/um/kernel/process.c --- um-linux-2.4.27-paolo/arch/um/kernel/process.c 2004-10-26 11:27:13.932302432 +0200 +++ um-linux-2.4.27-paolo/arch/um/kernel/process.c 2004-10-23 04:37:19.392835272 +0200 @@ -56,11 +56,7 @@ { int flags = altstack ? SA_ONSTACK : 0; - /* 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, + set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); diff -u um-linux-2.4.27-paolo/arch/um/kernel/tt/trap_user.c um-linux-2.4.27-paolo/arch/um/kernel/tt/trap_user.c --- um-linux-2.4.27-paolo/arch/um/kernel/tt/trap_user.c 2004-10-26 11:27:13.934302128 +0200 +++ um-linux-2.4.27-paolo/arch/um/kernel/tt/trap_user.c 2004-10-23 04:37:19.394834968 +0200 @@ -23,6 +23,13 @@ unprotect_kernel_mem(); + /* This is done because to allow SIGSEGV to be delivered inside a SEGV + * handler. This can happen in copy_user, and if SEGV is disabled, + * the process will die. + */ + if(sig == SIGSEGV) + change_sig(SIGSEGV, 1); + r = &TASK_REGS(get_current())->tt; save_regs = *r; is_user = user_context(SC_SP(sc));