about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-06 08:29:32 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-06 08:29:32 +0200
commit409334ea5650fa706827abd08676dfbb2244b0a4 (patch)
tree8c7bce58c07e0b1d6d0ea57dccca71b1a3243b21 /src
parent71218a6f70eab40fb6cb1a889416a729682f5e5d (diff)
downloadbox64-409334ea5650fa706827abd08676dfbb2244b0a4.tar.gz
box64-409334ea5650fa706827abd08676dfbb2244b0a4.zip
Some small improvments in signal handling
Diffstat (limited to 'src')
-rwxr-xr-xsrc/libtools/signals.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 34669f30..17ba10e5 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -856,13 +856,15 @@ exit(-1);
         uint32_t hash = 0;
         if(db)
             hash = X31_hash_code(db->x64_addr, db->x64_size);
-        printf_log(log_minimum, "%04d|%s @%p (%s) (x64pc=%p/%s:\"%s\", rsp=%p, stack=%p:%p own=%p fp=%p), for accessing %p (code=%d/prot=%x), db=%p(%p:%p/%p:%p/%s:%s, hash:%x/%x)", 
+        printf_log(log_minimum, "%04d|%s @%p (%s) (x64pc=%p/%s:\"%s\", rsp=%p, stack=%p:%p own=%p fp=%p), for accessing %p (code=%d/prot=%x), db=%p(%p:%p/%p:%p/%s:%s, hash:%x/%x) handler=%p", 
             GetTID(), signame, pc, name, (void*)x64pc, elfname?elfname:"???", x64name?x64name:"???", rsp, 
             emu->init_stack, emu->init_stack+emu->size_stack, emu->stack2free, (void*)R_RBP, 
             addr, info->si_code, 
             prot, db, db?db->block:0, db?(db->block+db->size):0, 
             db?db->x64_addr:0, db?(db->x64_addr+db->x64_size):0, 
-            getAddrFunctionName((uintptr_t)(db?db->x64_addr:0)), (db?db->need_test:0)?"need_stest":"clean", db?db->hash:0, hash);
+            getAddrFunctionName((uintptr_t)(db?db->x64_addr:0)), 
+            (db?db->need_test:0)?"need_stest":"clean", db?db->hash:0, hash, 
+            (void*)my_context->signals[sig]);
 #else
         printf_log(log_minimum, "%04d|%s @%p (%s) (x64pc=%p/%s:\"%s\", rsp=%p), for accessing %p (code=%d)", GetTID(), signame, pc, name, (void*)x64pc, elfname?elfname:"???", x64name?x64name:"???", rsp, addr, info->si_code);
 #endif
@@ -883,8 +885,9 @@ exit(-1);
     }
     // no handler (or double identical segfault)
     // set default and that's it, instruction will restart and default segfault handler will be called...
-    if(my_context->signals[sig]!=1)
-        signal(sig, SIG_DFL);
+    if(my_context->signals[sig]!=1 || sig==SIGSEGV || sig==SIGILL || sig==SIGFPE) {
+        signal(sig, (void*)my_context->signals[sig]);
+    }
 }
 
 void my_sigactionhandler(int32_t sig, siginfo_t* info, void * ucntx)
@@ -972,7 +975,7 @@ int EXPORT my_sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x
     }
     int ret = 0;
     if(signum!=SIGSEGV && signum!=SIGBUS && signum!=SIGILL)
-        sigaction(signum, act?&newact:NULL, oldact?&old:NULL);
+        ret = sigaction(signum, act?&newact:NULL, oldact?&old:NULL);
     if(oldact) {
         oldact->sa_flags = old.sa_flags;
         oldact->sa_mask = old.sa_mask;