git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.5.x5
[linux-2.6.git]
/
arch
/
um
/
kernel
/
tt
/
trap_user.c
diff --git
a/arch/um/kernel/tt/trap_user.c
b/arch/um/kernel/tt/trap_user.c
index
7a6dbf5
..
67fdef6
100644
(file)
--- a/
arch/um/kernel/tt/trap_user.c
+++ b/
arch/um/kernel/tt/trap_user.c
@@
-6,7
+6,6
@@
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
-#include <asm/sigcontext.h>
#include "sysdep/ptrace.h"
#include "signal_user.h"
#include "user_util.h"
#include "sysdep/ptrace.h"
#include "signal_user.h"
#include "user_util.h"
@@
-23,6
+22,13
@@
void sig_handler_common_tt(int sig, void *sc_ptr)
unprotect_kernel_mem();
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));
r = &TASK_REGS(get_current())->tt;
save_regs = *r;
is_user = user_context(SC_SP(sc));
@@
-30,7
+36,6
@@
void sig_handler_common_tt(int sig, void *sc_ptr)
if(sig != SIGUSR2)
r->syscall = -1;
if(sig != SIGUSR2)
r->syscall = -1;
- change_sig(SIGUSR1, 1);
info = &sig_info[sig];
if(!info->is_irq) unblock_signals();
info = &sig_info[sig];
if(!info->is_irq) unblock_signals();
@@
-39,7
+44,6
@@
void sig_handler_common_tt(int sig, void *sc_ptr)
if(is_user){
interrupt_end();
block_signals();
if(is_user){
interrupt_end();
block_signals();
- change_sig(SIGUSR1, 0);
set_user_mode(NULL);
}
*r = save_regs;
set_user_mode(NULL);
}
*r = save_regs;