From 5deeea5725b98e2a3b0eefce2ed5702067c884d9 Mon Sep 17 00:00:00 2001 From: daywalker90 Date: Wed, 23 Sep 2026 15:18:02 +0200 Subject: [PATCH] connectd: free individual listeners on shutdown In start_shutdown(), freeing daemon->listeners only freed the tal array of pointers, but not the struct io_listener objects themselves since they are parented to daemon. This left the listening sockets open and caused them to be flagged as memory leaks during leak detection: **BROKEN** connectd: MEMLEAK: 0x55b7288579f8 **BROKEN** connectd: label=ccan/ccan/io/io.c:25:struct io_listener **BROKEN** connectd: alloc: **BROKEN** connectd: ccan/ccan/io/io.c:25 (io_new_listener_) **BROKEN** connectd: connectd/connectd.c:1818 (connect_activate) **BROKEN** connectd: connectd/connectd.c:2357 (recv_req) **BROKEN** connectd: parents: **BROKEN** connectd: connectd/connectd.c:2519:struct daemon Explicitly tal_free each listener in daemon->listeners before freeing the array. Changelog-None (cherry picked from commit 862c46bb926a191d19b6a576010539bab9df4362) --- connectd/connectd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/connectd/connectd.c b/connectd/connectd.c index 3fb4a24615bd..baab35c86fa0 100644 --- a/connectd/connectd.c +++ b/connectd/connectd.c @@ -2026,6 +2026,8 @@ static void start_shutdown(struct daemon *daemon, const u8 *msg) daemon->shutting_down = true; /* No more incoming connections! */ + for (size_t i = 0; i < tal_count(daemon->listeners); i++) + tal_free(daemon->listeners[i]); daemon->listeners = tal_free(daemon->listeners); daemon_conn_send(daemon->master,