Make init_loop_data a little safer to use

This commit is contained in:
Kovid Goyal 2022-06-08 15:10:52 +05:30
parent c71bb877c3
commit 18dd13c872
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 9 additions and 7 deletions

View File

@ -137,7 +137,7 @@ new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) {
return NULL; return NULL;
} }
self = (ChildMonitor *)type->tp_alloc(type, 0); 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->talk_fd = talk_fd;
self->listen_fd = listen_fd; self->listen_fd = listen_fd;
if (self == NULL) return PyErr_NoMemory(); if (self == NULL) return PyErr_NoMemory();

View File

@ -33,12 +33,14 @@ handle_signal(int sig_num UNUSED, siginfo_t *si, void *ucontext UNUSED) {
bool bool
init_loop_data(LoopData *ld, size_t num_signals, ...) { init_loop_data(LoopData *ld, ...) {
ld->num_handled_signals = num_signals; ld->num_handled_signals = 0;
va_list valist; va_list valist;
va_start(valist, num_signals); va_start(valist, ld);
for (size_t i = 0; i < ld->num_handled_signals; i++) { while (true) {
ld->handled_signals[i] = va_arg(valist, int); int sig = va_arg(valist, int);
if (!sig) break;
ld->handled_signals[ld->num_handled_signals++] = sig;
} }
va_end(valist); va_end(valist);
#ifdef HAS_EVENT_FD #ifdef HAS_EVENT_FD

View File

@ -44,7 +44,7 @@ typedef struct {
} LoopData; } LoopData;
typedef void(*handle_signal_func)(const siginfo_t* siginfo, void *data); 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 free_loop_data(LoopData *ld);
void wakeup_loop(LoopData *ld, bool in_signal_handler, const char*); void wakeup_loop(LoopData *ld, bool in_signal_handler, const char*);
void read_signals(int fd, handle_signal_func callback, void *data); void read_signals(int fd, handle_signal_func callback, void *data);