]> git.ipfire.org Git - pakfire.git/commitdiff
daemon: Don't leak signal events
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 26 Jun 2025 13:25:46 +0000 (13:25 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 26 Jun 2025 13:25:46 +0000 (13:25 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/daemon.c

index c04c19de867164042d55a6962e13600632913d9a..849726e9b0a9c4f0e3a0334c8c4c86a932a1a97d 100644 (file)
@@ -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)