From: Arran Cudbard-Bell Date: Wed, 15 May 2024 01:59:50 +0000 (-0600) Subject: Move packet global free to the atexit handlers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e42947b083e77e0c6fc5d2c4de090f5d18eb06ae;p=thirdparty%2Ffreeradius-server.git Move packet global free to the atexit handlers --- diff --git a/src/bin/dhcpclient.c b/src/bin/dhcpclient.c index a892c213f26..50e7687664c 100644 --- a/src/bin/dhcpclient.c +++ b/src/bin/dhcpclient.c @@ -738,8 +738,6 @@ int main(int argc, char **argv) fr_dhcpv4_global_free(); - packet_global_free(); - if (fr_dict_autofree(dhcpclient_dict) < 0) { fr_perror("dhcpclient"); ret = -1; diff --git a/src/bin/radclient-ng.c b/src/bin/radclient-ng.c index 1bc5a82c626..60ad50dc164 100644 --- a/src/bin/radclient-ng.c +++ b/src/bin/radclient-ng.c @@ -1739,8 +1739,6 @@ int main(int argc, char **argv) fr_radius_global_free(); - packet_global_free(); - if (fr_dict_autofree(radclient_dict) < 0) { fr_perror("radclient"); ret = EXIT_FAILURE; diff --git a/src/bin/radclient.c b/src/bin/radclient.c index 84408dbf497..ee12c0a57a5 100644 --- a/src/bin/radclient.c +++ b/src/bin/radclient.c @@ -2065,8 +2065,6 @@ int main(int argc, char **argv) fr_radius_global_free(); - packet_global_free(); - if (fr_dict_autofree(radclient_dict) < 0) { fr_perror("radclient"); ret = EXIT_FAILURE; diff --git a/src/lib/server/base.c b/src/lib/server/base.c index e680d4c5175..283934df3b3 100644 --- a/src/lib/server/base.c +++ b/src/lib/server/base.c @@ -110,11 +110,6 @@ int server_init(CONF_SECTION *cs) */ void server_free(void) { - /* - * Free any resources used by 'Net.' packet - */ - packet_global_free(); - /* * Free xlat instance data, and call any detach methods */ diff --git a/src/lib/server/packet.c b/src/lib/server/packet.c index 2882adc2113..4dc2b7d7b70 100644 --- a/src/lib/server/packet.c +++ b/src/lib/server/packet.c @@ -20,11 +20,14 @@ * * @copyright 2023 Network RADIUS SAS (legal@networkradius.com) */ + RCSID("$Id$") -#include +#include #include +#include + static fr_dict_t const *dict_freeradius; extern fr_dict_autoload_t util_packet_dict[]; @@ -153,14 +156,14 @@ void fr_packet_pairs_to_packet(fr_packet_t *packet, fr_pair_list_t const *list) } } -/** Initialises the Net. packet attributes. - * - * @note Call packet_global_free() when the server is done to avoid leaks. - * @return - * - 0 on success. - * - -1 on failure. - */ -int packet_global_init(void) +static int _packet_global_free(UNUSED void *uctx) +{ + fr_dict_autofree(util_packet_dict); + + return 0; +} + +static int _packet_global_init(UNUSED void *uctx) { if (fr_dict_autoload(util_packet_dict) < 0) { error: @@ -173,7 +176,17 @@ int packet_global_init(void) return 0; } -void packet_global_free(void) +/** Initialises the Net. packet attributes. + * + * @return + * - 0 on success. + * - -1 on failure. + */ +int packet_global_init(void) { - fr_dict_autofree(util_packet_dict); + int ret; + + fr_atexit_global_once_ret(&ret, _packet_global_init, _packet_global_free, NULL); + + return ret; } diff --git a/src/lib/server/packet.h b/src/lib/server/packet.h index 50bd51c5228..3ef57fdc37e 100644 --- a/src/lib/server/packet.h +++ b/src/lib/server/packet.h @@ -34,7 +34,6 @@ int fr_packet_pairs_from_packet(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_packet void fr_packet_pairs_to_packet(fr_packet_t *packet, fr_pair_list_t const *list) CC_HINT(nonnull); int packet_global_init(void); -void packet_global_free(void); #ifdef __cplusplus }