summaryrefslogtreecommitdiffhomepage
path: root/vm.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2024-12-11 23:20:56 +0100
committerJo-Philipp Wich <jo@mein.io>2024-12-11 23:20:56 +0100
commit0b80ceb29311b7eccce9d318e5315e5d88d29c28 (patch)
tree97e0059b68ed957c96257f979d8fce7f34417593 /vm.c
parent3eb4e2a038448d27057794f968afa3bb4bf0766e (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.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/vm.c b/vm.c
index 1d40810..fc322c5 100644
--- a/vm.c
+++ b/vm.c
@@ -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;
}