From 9393d36690ccfff3904597eac76be59567651424 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 12 Dec 2023 12:03:10 -0500 Subject: [PATCH 1/2] zebra: On shutdown, free up srv6 list data Signed-off-by: Donald Sharp --- zebra/main.c | 2 ++ zebra/zebra_srv6.c | 20 +++++++++++++++++++- zebra/zebra_srv6.h | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/zebra/main.c b/zebra/main.c index d34fdb3bf8..5dd830b542 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -236,6 +236,8 @@ void zebra_finalize(struct event *dummy) zebra_pw_terminate(); + zebra_srv6_terminate(); + label_manager_terminate(); ns_terminate(); diff --git a/zebra/zebra_srv6.c b/zebra/zebra_srv6.c index 94b93e5e8d..ee463c76a8 100644 --- a/zebra/zebra_srv6.c +++ b/zebra/zebra_srv6.c @@ -216,9 +216,10 @@ void zebra_notify_srv6_locator_delete(struct srv6_locator *locator) } } +struct zebra_srv6 srv6; + struct zebra_srv6 *zebra_srv6_get_default(void) { - static struct zebra_srv6 srv6; static bool first_execution = true; if (first_execution) { @@ -408,6 +409,23 @@ int release_daemon_srv6_locator_chunks(struct zserv *client) return count; } +void zebra_srv6_terminate(void) +{ + struct srv6_locator *locator; + + if (!srv6.locators) + return; + + while (listcount(srv6.locators)) { + locator = listnode_head(srv6.locators); + + listnode_delete(srv6.locators, locator); + srv6_locator_free(locator); + } + + list_delete(&srv6.locators); +} + void zebra_srv6_init(void) { hook_register(zserv_client_close, zebra_srv6_cleanup); diff --git a/zebra/zebra_srv6.h b/zebra/zebra_srv6.h index 51db83d6fb..73876741fd 100644 --- a/zebra/zebra_srv6.h +++ b/zebra/zebra_srv6.h @@ -52,6 +52,7 @@ void zebra_notify_srv6_locator_add(struct srv6_locator *locator); void zebra_notify_srv6_locator_delete(struct srv6_locator *locator); extern void zebra_srv6_init(void); +extern void zebra_srv6_terminate(void); extern struct zebra_srv6 *zebra_srv6_get_default(void); extern bool zebra_srv6_is_enable(void); From 8fcacf680389778e29acf68adbec9a7021217a22 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 12 Dec 2023 13:29:47 -0500 Subject: [PATCH 2/2] zebra: Don't leak memory in rtadv.c code on shutdown The adata variable was being leaked on shutdown since it was calloc'ed. There is no need to make this dynamic memory. Just choose a size and use that. Add a bit of code to ensure that if it's not large enough, it will just stop and the developer will fix it. Signed-off-by: Donald Sharp --- zebra/main.c | 2 ++ zebra/rtadv.c | 30 +++++++++++++----------------- zebra/rtadv.h | 1 + 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/zebra/main.c b/zebra/main.c index 5dd830b542..604d8974b3 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -432,6 +432,8 @@ int main(int argc, char **argv) zebra_vty_init(); access_list_init(); prefix_list_init(); + + rtadv_init(); rtadv_cmd_init(); /* PTM socket */ #ifdef ZEBRA_PTM_SUPPORT diff --git a/zebra/rtadv.c b/zebra/rtadv.c index 35df4eb976..df444ee523 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -33,6 +33,7 @@ extern struct zebra_privs_t zserv_privs; static uint32_t interfaces_configured_for_ra_from_bgp; +#define RTADV_ADATA_SIZE 1024 #if defined(HAVE_RTADV) @@ -187,8 +188,9 @@ static void rtadv_send_packet(int sock, struct interface *ifp, struct cmsghdr *cmsgptr; struct in6_pktinfo *pkt; struct sockaddr_in6 addr; - static void *adata = NULL; unsigned char buf[RTADV_MSG_SIZE]; + char adata[RTADV_ADATA_SIZE]; + struct nd_router_advert *rtadv; int ret; int len = 0; @@ -199,22 +201,6 @@ static void rtadv_send_packet(int sock, struct interface *ifp, struct listnode *node; uint16_t pkt_RouterLifetime; - /* - * Allocate control message bufffer. This is dynamic because - * CMSG_SPACE is not guaranteed not to call a function. Note that - * the size will be different on different architectures due to - * differing alignment rules. - */ - if (adata == NULL) { - /* XXX Free on shutdown. */ - adata = calloc(1, CMSG_SPACE(sizeof(struct in6_pktinfo))); - - if (adata == NULL) { - zlog_debug("%s: can't malloc control data", __func__); - exit(-1); - } - } - /* Logging of packet. */ if (IS_ZEBRA_DEBUG_PACKET) zlog_debug("%s(%s:%u): Tx RA, socket %u", ifp->name, @@ -3069,3 +3055,13 @@ uint32_t rtadv_get_interfaces_configured_from_bgp(void) { return interfaces_configured_for_ra_from_bgp; } + +void rtadv_init(void) +{ + if (CMSG_SPACE(sizeof(struct in6_pktinfo)) > RTADV_ADATA_SIZE) { + zlog_debug("%s: RTADV_ADATA_SIZE choosen will not work on this platform, please use a larger size", + __func__); + + exit(-1); + } +} diff --git a/zebra/rtadv.h b/zebra/rtadv.h index 1ec376a106..9d358d4b0d 100644 --- a/zebra/rtadv.h +++ b/zebra/rtadv.h @@ -435,6 +435,7 @@ extern void zebra_interface_radv_enable(ZAPI_HANDLER_ARGS); extern uint32_t rtadv_get_interfaces_configured_from_bgp(void); extern bool rtadv_compiled_in(void); +extern void rtadv_init(void); #ifdef __cplusplus }