diff options
author | Jo-Philipp Wich <jo@mein.io> | 2024-12-11 23:20:56 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2024-12-11 23:20:56 +0100 |
commit | 0b80ceb29311b7eccce9d318e5315e5d88d29c28 (patch) | |
tree | 97e0059b68ed957c96257f979d8fce7f34417593 /vm.c | |
parent | 3eb4e2a038448d27057794f968afa3bb4bf0766e (diff) |
vm: close signal pipe in uc_vm_signal_handlers_reset()
The previously introduced signal handler restoration logic did not take
the signal dispatching pipe into account.
Extend the `uc_vm_signal_handlers_reset()` function to also close any
related pipe handles.
Fixes: #255
Fixes: f9d2faf ("vm: reset signals when freeing VM")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -190,7 +190,7 @@ 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; + size_t i, signo; if (vm != tctx->signal_handler_vm) return; @@ -202,6 +202,13 @@ uc_vm_signal_handlers_reset(uc_vm_t *vm) if (ucv_is_callable(ucv_array_get(vm->signal.handler, signo))) sigaction(signo, &sa, NULL); + for (i = 0; i < ARRAY_SIZE(vm->signal.sigpipe); i++) { + if (vm->signal.sigpipe[i] > STDERR_FILENO) + close(vm->signal.sigpipe[i]); + + vm->signal.sigpipe[i] = -1; + } + tctx->signal_handler_vm = NULL; } |