]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix srv6 memory leak detection
authorPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 29 Mar 2024 07:35:34 +0000 (08:35 +0100)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Sat, 30 Mar 2024 15:10:20 +0000 (15:10 +0000)
The asan memory leak has been detected:
> Direct leak of 16 byte(s) in 1 object(s) allocated from:
>     #0 0x7f9066dadd28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
>     #1 0x7f9066779b5d in qcalloc lib/memory.c:105
>     #2 0x556d6ca527c2 in vpn_leak_zebra_vrf_sid_update_per_af bgpd/bgp_mplsvpn.c:389
>     #3 0x556d6ca530e1 in vpn_leak_zebra_vrf_sid_update bgpd/bgp_mplsvpn.c:451
>     #4 0x556d6ca64b3b in vpn_leak_postchange bgpd/bgp_mplsvpn.h:311
>     #5 0x556d6ca64b3b in vpn_leak_postchange_all bgpd/bgp_mplsvpn.c:3751
>     #6 0x556d6cb9f116 in bgp_zebra_process_srv6_locator_chunk bgpd/bgp_zebra.c:3337
>     #7 0x7f906685a6b6 in zclient_read lib/zclient.c:4490
>     #8 0x7f9066826a32 in event_call lib/event.c:2011
>     #9 0x7f906675c444 in frr_run lib/libfrr.c:1217
>     #10 0x556d6c980d52 in main bgpd/bgp_main.c:545
>     #11 0x7f9065784c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86)

Fix this by freeing the previous memory chunk.

Fixes: b72c9e14756f ("bgpd: cli for SRv6 SID alloc to redirect to vrf (step4)")
Fixes: 527588aa78b2 ("bgpd: add support for per-VRF SRv6 SID")
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
(cherry picked from commit eea8a8ae248ed726449878c7a74705d779469fda)

bgpd/bgp_mplsvpn.c

index f324a3263b33043aae7feca7d239161019a3795c..9766c2298dd6c31fc62c7b116ac2397efdce59de 100644 (file)
@@ -385,6 +385,9 @@ void vpn_leak_zebra_vrf_sid_update_per_af(struct bgp *bgp, afi_t afi)
 
        tovpn_sid_ls = XCALLOC(MTYPE_BGP_SRV6_SID, sizeof(struct in6_addr));
        *tovpn_sid_ls = *tovpn_sid;
+       if (bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent)
+               XFREE(MTYPE_BGP_SRV6_SID,
+                     bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent);
        bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent = tovpn_sid_ls;
 }
 
@@ -432,6 +435,8 @@ void vpn_leak_zebra_vrf_sid_update_per_vrf(struct bgp *bgp)
 
        tovpn_sid_ls = XCALLOC(MTYPE_BGP_SRV6_SID, sizeof(struct in6_addr));
        *tovpn_sid_ls = *tovpn_sid;
+       if (bgp->tovpn_zebra_vrf_sid_last_sent)
+               XFREE(MTYPE_BGP_SRV6_SID, bgp->tovpn_zebra_vrf_sid_last_sent);
        bgp->tovpn_zebra_vrf_sid_last_sent = tovpn_sid_ls;
 }
 
@@ -479,6 +484,7 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_af(struct bgp *bgp, afi_t afi)
                bgp->vrf_id, ZEBRA_SEG6_LOCAL_ACTION_UNSPEC, NULL);
        XFREE(MTYPE_BGP_SRV6_SID,
              bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent);
+       bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent = NULL;
 }
 
 /*
@@ -505,6 +511,7 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_vrf(struct bgp *bgp)
                              bgp->vrf_id, ZEBRA_SEG6_LOCAL_ACTION_UNSPEC,
                              NULL);
        XFREE(MTYPE_BGP_SRV6_SID, bgp->tovpn_zebra_vrf_sid_last_sent);
+       bgp->tovpn_zebra_vrf_sid_last_sent = NULL;
 }
 
 /*