From: Michael Tremer Date: Thu, 26 Jun 2025 13:25:46 +0000 (+0000) Subject: daemon: Don't leak signal events X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=451b0438ff3f6b3453f6084e146c66893ac9295a;p=pakfire.git daemon: Don't leak signal events Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/daemon.c b/src/pakfire/daemon.c index c04c19de..849726e9 100644 --- a/src/pakfire/daemon.c +++ b/src/pakfire/daemon.c @@ -46,6 +46,13 @@ struct pakfire_daemon { // Event Loop sd_event* loop; + // Events + struct pakfire_daemon_events { + sd_event_source* sigterm; + sd_event_source* sigint; + sd_event_source* sigchld; + } events; + // dbus sd_bus* bus; int inhibitfd; @@ -238,7 +245,7 @@ static int pakfire_daemon_setup_loop(struct pakfire_daemon* self) { } // Listen for SIGTERM - r = sd_event_add_signal(self->loop, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, + r = sd_event_add_signal(self->loop, &self->events.sigterm, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, pakfire_daemon_terminate, daemon); if (r < 0) { ERROR(self->ctx, "Could not register handling SIGTERM: %s\n", strerror(-r)); @@ -246,7 +253,7 @@ static int pakfire_daemon_setup_loop(struct pakfire_daemon* self) { } // Listen for SIGINT - r = sd_event_add_signal(self->loop, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, + r = sd_event_add_signal(self->loop, &self->events.sigint, SIGINT|SD_EVENT_SIGNAL_PROCMASK, pakfire_daemon_terminate, daemon); if (r < 0) { ERROR(self->ctx, "Could not register handling SIGINT: %s\n", strerror(-r)); @@ -254,7 +261,7 @@ static int pakfire_daemon_setup_loop(struct pakfire_daemon* self) { } // Listen for SIGCHLD - r = sd_event_add_signal(self->loop, NULL, SIGCHLD|SD_EVENT_SIGNAL_PROCMASK, + r = sd_event_add_signal(self->loop, &self->events.sigchld, SIGCHLD|SD_EVENT_SIGNAL_PROCMASK, pakfire_daemon_SIGCHLD, daemon); if (r < 0) { ERROR(self->ctx, "Could not register handling SIGCHLD: %s\n", strerror(-r)); @@ -299,6 +306,14 @@ static void pakfire_daemon_free(struct pakfire_daemon* self) { // Release shutdown inhibition pakfire_daemon_release_inhibit_shutdown(self); + // Events + if (self->events.sigterm) + sd_event_source_unref(self->events.sigterm); + if (self->events.sigint) + sd_event_source_unref(self->events.sigint); + if (self->events.sigchld) + sd_event_source_unref(self->events.sigchld); + if (self->builder) pakfire_builder_unref(self->builder); if (self->client)