summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2023-12-12 13:29:47 -0500
committerDonald Sharp <sharpd@nvidia.com>2023-12-12 13:29:47 -0500
commit8fcacf680389778e29acf68adbec9a7021217a22 (patch)
treed96af678a6af2afc320784a59269dc6ed6de0fbc
parent9393d36690ccfff3904597eac76be59567651424 (diff)
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 <sharpd@nvidia.com>
-rw-r--r--zebra/main.c2
-rw-r--r--zebra/rtadv.c30
-rw-r--r--zebra/rtadv.h1
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
}