diff options
author | jdike <jdike> | 2003-09-08 16:30:38 +0000 |
---|---|---|
committer | jdike <jdike> | 2003-09-08 16:30:38 +0000 |
commit | 28f4faf34e91e42d08e3c8be6e43ef7a082301f0 (patch) | |
tree | fd3c00bbd76f6fcd619c1b4caf590f919170331a | |
parent | 6c784a6fd6b30d94176b5f0d439e9472ecff841d (diff) | |
download | uml-history-28f4faf34e91e42d08e3c8be6e43ef7a082301f0.tar.gz |
Changed setjmp/longjmp to sigsetjmp/siglongjmp to ensure that the old signal
mask gets restored. This fixes a process segfault that some people are seeing.
Also fixed a bug which broke ltrace.
-rw-r--r-- | arch/um/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/skas/process.c | 26 | ||||
-rw-r--r-- | arch/um/kernel/trap_user.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/tt/uaccess_user.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/uaccess_user.c | 2 |
5 files changed, 17 insertions, 17 deletions
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index bfaa42b..bc693ec 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -232,7 +232,7 @@ int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr) int n; *jmp_ptr = &buf; - n = setjmp(buf); + n = sigsetjmp(buf, 1); if(n != 0) return(n); (*fn)(arg); diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c index 77f89f8..210ff93 100644 --- a/arch/um/kernel/skas/process.c +++ b/arch/um/kernel/skas/process.c @@ -59,11 +59,11 @@ static void handle_trap(int pid, union uml_pt_regs *regs) int err, syscall_nr, status; syscall_nr = PT_SYSCALL_NR(regs->skas.regs); + UPT_SYSCALL_NR(regs) = syscall_nr; if(syscall_nr < 1){ relay_signal(SIGTRAP, regs); return; } - UPT_SYSCALL_NR(regs) = syscall_nr; err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid); if(err < 0) @@ -189,7 +189,7 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, *switch_buf_ptr = &switch_buf; *fork_buf_ptr = &fork_buf; - if(setjmp(fork_buf) == 0) + if(sigsetjmp(fork_buf, 1) == 0) new_thread_proc(stack, handler); remove_sigstack(); @@ -201,8 +201,8 @@ void thread_wait(void *sw, void *fb) *switch_buf = &buf; fork_buf = fb; - if(setjmp(buf) == 0) - longjmp(*fork_buf, 1); + if(sigsetjmp(buf, 1) == 0) + siglongjmp(*fork_buf, 1); } static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs, @@ -260,8 +260,8 @@ void switch_threads(void *me, void *next) jmp_buf my_buf, **me_ptr = me, *next_buf = next; *me_ptr = &my_buf; - if(setjmp(my_buf) == 0) - longjmp(*next_buf, 1); + if(sigsetjmp(my_buf, 1) == 0) + siglongjmp(*next_buf, 1); } static jmp_buf initial_jmpbuf; @@ -277,14 +277,14 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) int n; *fork_buf_ptr = &initial_jmpbuf; - n = setjmp(initial_jmpbuf); + n = sigsetjmp(initial_jmpbuf, 1); if(n == 0) new_thread_proc((void *) stack, new_thread_handler); else if(n == 1) remove_sigstack(); else if(n == 2){ (*cb_proc)(cb_arg); - longjmp(*cb_back, 1); + siglongjmp(*cb_back, 1); } else if(n == 3){ kmalloc_ok = 0; @@ -294,7 +294,7 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) kmalloc_ok = 0; return(1); } - longjmp(**switch_buf, 1); + siglongjmp(**switch_buf, 1); } void remove_sigstack(void) @@ -316,8 +316,8 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg) cb_back = &here; block_signals(); - if(setjmp(here) == 0) - longjmp(initial_jmpbuf, 2); + if(sigsetjmp(here, 1) == 0) + siglongjmp(initial_jmpbuf, 2); unblock_signals(); cb_proc = NULL; @@ -328,13 +328,13 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg) void halt_skas(void) { block_signals(); - longjmp(initial_jmpbuf, 3); + siglongjmp(initial_jmpbuf, 3); } void reboot_skas(void) { block_signals(); - longjmp(initial_jmpbuf, 4); + siglongjmp(initial_jmpbuf, 4); } int new_mm(int from) diff --git a/arch/um/kernel/trap_user.c b/arch/um/kernel/trap_user.c index 93d4e61..f54f7f2 100644 --- a/arch/um/kernel/trap_user.c +++ b/arch/um/kernel/trap_user.c @@ -125,7 +125,7 @@ void do_longjmp(void *b, int val) { jmp_buf *buf = b; - longjmp(*buf, val); + siglongjmp(*buf, val); } /* diff --git a/arch/um/kernel/tt/uaccess_user.c b/arch/um/kernel/tt/uaccess_user.c index 45a6bc8..1a38a28 100644 --- a/arch/um/kernel/tt/uaccess_user.c +++ b/arch/um/kernel/tt/uaccess_user.c @@ -75,7 +75,7 @@ int __do_strnlen_user(const char *str, unsigned long n, jmp_buf jbuf; *fault_catcher = &jbuf; - if(setjmp(jbuf) == 0){ + if(sigsetjmp(jbuf, 1) == 0){ ret = strlen(str) + 1; } else { diff --git a/arch/um/kernel/uaccess_user.c b/arch/um/kernel/uaccess_user.c index eb9be24..fc07951 100644 --- a/arch/um/kernel/uaccess_user.c +++ b/arch/um/kernel/uaccess_user.c @@ -20,7 +20,7 @@ unsigned long __do_user_copy(void *to, const void *from, int n, jmp_buf jbuf; *fault_catcher = &jbuf; - if(setjmp(jbuf) == 0){ + if(sigsetjmp(jbuf, 1) == 0){ (*op)(to, from, n); ret = 0; *faulted_out = 0; |