diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2023-12-12 13:29:47 -0500 | 
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2023-12-12 13:29:47 -0500 | 
| commit | 8fcacf680389778e29acf68adbec9a7021217a22 (patch) | |
| tree | d96af678a6af2afc320784a59269dc6ed6de0fbc | |
| parent | 9393d36690ccfff3904597eac76be59567651424 (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.c | 2 | ||||
| -rw-r--r-- | zebra/rtadv.c | 30 | ||||
| -rw-r--r-- | 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  }  | 
