From 3cbbea830ddd1d9e55a5ba77b49bacbac0257685 Mon Sep 17 00:00:00 2001 From: Paul Donald Date: Tue, 30 Dec 2025 16:13:29 +0100 Subject: [PATCH] netlink: clean up sockets, close files MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Sockets are handled for most usage paths, except for shutdown. Handle those at shutdown. Signed-off-by: Paul Donald Link: https://github.com/openwrt/odhcpd/pull/367 Signed-off-by: Álvaro Fernández Rojas --- src/netlink.c | 36 ++++++++++++++++++++++++++---------- src/router.c | 17 +++++++++++++---- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/netlink.c b/src/netlink.c index d58e452..2473476 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -53,6 +53,29 @@ static struct event_socket rtnl_event = { .sock_bufsize = 133120, }; +/* Shut down and free netlink sockets/registration. Safe to call multiple times. */ +static void netlink_shutdown(void) +{ + /* Deregister event and free the event socket */ + if (rtnl_event.sock) { + odhcpd_deregister(&rtnl_event.ev); + + if (rtnl_event.ev.uloop.fd >= 0) { + close(rtnl_event.ev.uloop.fd); + rtnl_event.ev.uloop.fd = -1; + } + + nl_socket_free(rtnl_event.sock); + rtnl_event.sock = NULL; + } + + /* Free the primary rtnl socket */ + if (rtnl_socket) { + nl_socket_free(rtnl_socket); + rtnl_socket = NULL; + } +} + int netlink_init(void) { rtnl_socket = create_socket(NETLINK_ROUTE); @@ -85,19 +108,12 @@ int netlink_init(void) odhcpd_register(&rtnl_event.ev); + atexit(netlink_shutdown); + return 0; err: - if (rtnl_socket) { - nl_socket_free(rtnl_socket); - rtnl_socket = NULL; - } - - if (rtnl_event.sock) { - nl_socket_free(rtnl_event.sock); - rtnl_event.sock = NULL; - rtnl_event.ev.uloop.fd = -1; - } + netlink_shutdown(); return -1; } diff --git a/src/router.c b/src/router.c index 6a1d9cb..731a6dc 100644 --- a/src/router.c +++ b/src/router.c @@ -45,6 +45,15 @@ static FILE *fp_route = NULL; #define TIME_LEFT(t1, now) ((t1) != UINT32_MAX ? (t1) - (now) : UINT32_MAX) +/* Shutdown helper: close fp_route if open. Safe to call multiple times. */ +static void router_shutdown(void) +{ + if (fp_route) { + fclose(fp_route); + fp_route = NULL; + } +} + int router_init(void) { int ret = 0; @@ -60,11 +69,11 @@ int router_init(void) ret = -1; } + atexit(router_shutdown); + out: - if (ret < 0 && fp_route) { - fclose(fp_route); - fp_route = NULL; - } + if (ret < 0) + router_shutdown(); return ret; } -- 2.30.2