diff options
author | Jo-Philipp Wich <jo@mein.io> | 2024-12-02 12:56:19 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2024-12-02 15:25:44 +0100 |
commit | f9d2faf67de643911f7b9bcdbab1ab2d7d108dff (patch) | |
tree | 0d4a60b969258b8e8123486cfe606ee7736d46f5 | |
parent | efeb578065523b2882d71d91f38cd63115928b7a (diff) |
vm: reset signals when freeing VM
When invoking `uc_vm_free()` on a VM with enabled `.setup_signal_handlers`
configuration, reset system signal handlers back to their default actions.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | vm.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -185,6 +185,26 @@ uc_vm_signal_handlers_setup(uc_vm_t *vm) tctx->signal_handler_vm = vm; } +static void +uc_vm_signal_handlers_reset(uc_vm_t *vm) +{ + uc_thread_context_t *tctx = uc_thread_context_get(); + struct sigaction sa = { 0 }; + size_t signo; + + if (vm != tctx->signal_handler_vm) + return; + + sa.sa_handler = SIG_DFL; + sigemptyset(&sa.sa_mask); + + for (signo = 0; signo < ucv_array_length(vm->signal.handler); signo++) + if (ucv_is_callable(ucv_array_get(vm->signal.handler, signo))) + sigaction(signo, &sa, NULL); + + tctx->signal_handler_vm = NULL; +} + void uc_vm_init(uc_vm_t *vm, uc_parse_config_t *config) { vm->exception.type = EXCEPTION_NONE; @@ -217,6 +237,8 @@ void uc_vm_free(uc_vm_t *vm) uc_upvalref_t *ref; size_t i; + uc_vm_signal_handlers_reset(vm); + ucv_put(vm->exception.stacktrace); free(vm->exception.message); |