]> git.puffer.fish Git - mirror/frr.git/commit
bgpd: fix memory leak when updating peer up loc rib events
authorPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 18 Dec 2024 15:04:06 +0000 (16:04 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 30 Dec 2024 14:13:37 +0000 (15:13 +0100)
commit92f98484d7f2f9086c36f476a1cb8824ef826a06
tree0514ac82217f3fdc5ff4c1b200498beda67f52c0
parent6e2d58854dbbcfa052d56a6b9479ae5988aa0c61
bgpd: fix memory leak when updating peer up loc rib events

The following memory leak can be observed when turning off and on the
BGP vrf interface.

> ==706056==ERROR: LeakSanitizer: detected memory leaks
>
> Direct leak of 78 byte(s) in 1 object(s) allocated from:
>     #0 0x7fbf5f6b4887 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145
>     #1 0x7fbf5f0771f8 in qmalloc lib/memory.c:101
>     #2 0x7fbf5bdde610 in bmp_bgp_peer_vrf bgpd/bgp_bmp.c:2042
>     #3 0x7fbf5bdde8aa in bmp_bgp_update_vrf_status bgpd/bgp_bmp.c:2079
>     #4 0x7fbf5bdeaa1c in bmp_vrf_itf_state_changed bgpd/bgp_bmp.c:3204
>     #5 0x562740f0d83f in hook_call_bgp_vrf_status_changed bgpd/bgp_zebra.c:64
>     #6 0x562740f0ee28 in bgp_ifp_up bgpd/bgp_zebra.c:234
>     #7 0x7fbf5f01c193 in hook_call_if_up lib/if.c:57
>     #8 0x7fbf5f01d09a in if_up_via_zapi lib/if.c:203
>     #9 0x7fbf5f1d6f54 in zclient_interface_up lib/zclient.c:2671
>     #10 0x7fbf5f1e3e5a in zclient_read lib/zclient.c:4624
>     #11 0x7fbf5f18078d in event_call lib/event.c:1996
>     #12 0x7fbf5f048933 in frr_run lib/libfrr.c:1232
>     #13 0x562740c0cae1 in main bgpd/bgp_main.c:557
>     #14 0x7fbf5ea29d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
>
> Direct leak of 78 byte(s) in 1 object(s) allocated from:
>     #0 0x7fbf5f6b4887 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145
>     #1 0x7fbf5f0771f8 in qmalloc lib/memory.c:101
>     #2 0x7fbf5bdde610 in bmp_bgp_peer_vrf bgpd/bgp_bmp.c:2042
>     #3 0x7fbf5bdde8aa in bmp_bgp_update_vrf_status bgpd/bgp_bmp.c:2079
>     #4 0x7fbf5bdd4839 in bmp_send_peerup_vrf bgpd/bgp_bmp.c:627
>     #5 0x7fbf5bddb0d3 in bmp_wrfill bgpd/bgp_bmp.c:1590
>     #6 0x7fbf5f10841f in pullwr_run lib/pullwr.c:197
>     #7 0x7fbf5f18078d in event_call lib/event.c:1996
>     #8 0x7fbf5f048933 in frr_run lib/libfrr.c:1232
>     #9 0x562740c0cae1 in main bgpd/bgp_main.c:557
>     #10 0x7fbf5ea29d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58

Fix this by freeing the previous open_tx and open_rx contexts before
setting up the new one. Also at deletion of peer, free the open_rx
context.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_bmp.c