From 18dd13c872a062e5aae68f3c0e7d599e60bfd870 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 8 Jun 2022 15:10:52 +0530 Subject: [PATCH] Make init_loop_data a little safer to use --- kitty/child-monitor.c | 2 +- kitty/loop-utils.c | 12 +++++++----- kitty/loop-utils.h | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index 2fc27ec5b..56bf1c3b2 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -137,7 +137,7 @@ new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) { return NULL; } self = (ChildMonitor *)type->tp_alloc(type, 0); - if (!init_loop_data(&self->io_loop_data, 6, SIGINT, SIGHUP, SIGTERM, SIGCHLD, SIGUSR1, SIGUSR2)) return PyErr_SetFromErrno(PyExc_OSError); + if (!init_loop_data(&self->io_loop_data, SIGINT, SIGHUP, SIGTERM, SIGCHLD, SIGUSR1, SIGUSR2, 0)) return PyErr_SetFromErrno(PyExc_OSError); self->talk_fd = talk_fd; self->listen_fd = listen_fd; if (self == NULL) return PyErr_NoMemory(); diff --git a/kitty/loop-utils.c b/kitty/loop-utils.c index 216dd2fd0..831f8c11a 100644 --- a/kitty/loop-utils.c +++ b/kitty/loop-utils.c @@ -33,12 +33,14 @@ handle_signal(int sig_num UNUSED, siginfo_t *si, void *ucontext UNUSED) { bool -init_loop_data(LoopData *ld, size_t num_signals, ...) { - ld->num_handled_signals = num_signals; +init_loop_data(LoopData *ld, ...) { + ld->num_handled_signals = 0; va_list valist; - va_start(valist, num_signals); - for (size_t i = 0; i < ld->num_handled_signals; i++) { - ld->handled_signals[i] = va_arg(valist, int); + va_start(valist, ld); + while (true) { + int sig = va_arg(valist, int); + if (!sig) break; + ld->handled_signals[ld->num_handled_signals++] = sig; } va_end(valist); #ifdef HAS_EVENT_FD diff --git a/kitty/loop-utils.h b/kitty/loop-utils.h index df89fb211..1cb4c9691 100644 --- a/kitty/loop-utils.h +++ b/kitty/loop-utils.h @@ -44,7 +44,7 @@ typedef struct { } LoopData; typedef void(*handle_signal_func)(const siginfo_t* siginfo, void *data); -bool init_loop_data(LoopData *ld, size_t num_handled_signals, ...); +bool init_loop_data(LoopData *ld, ...); void free_loop_data(LoopData *ld); void wakeup_loop(LoopData *ld, bool in_signal_handler, const char*); void read_signals(int fd, handle_signal_func callback, void *data);