summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2003-09-08 16:30:38 +0000
committerjdike <jdike>2003-09-08 16:30:38 +0000
commit28f4faf34e91e42d08e3c8be6e43ef7a082301f0 (patch)
treefd3c00bbd76f6fcd619c1b4caf590f919170331a
parent6c784a6fd6b30d94176b5f0d439e9472ecff841d (diff)
downloaduml-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.c2
-rw-r--r--arch/um/kernel/skas/process.c26
-rw-r--r--arch/um/kernel/trap_user.c2
-rw-r--r--arch/um/kernel/tt/uaccess_user.c2
-rw-r--r--arch/um/kernel/uaccess_user.c2
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;