]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Fix memory leak for `conf_copy()` - SoO ecommunity
authorDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 9 Sep 2022 23:28:07 +0000 (02:28 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Sat, 10 Sep 2022 15:13:45 +0000 (18:13 +0300)
==1179738== 48 (40 direct, 8 indirect) bytes in 1 blocks are definitely lost in loss record 13 of 29
==1179738==    at 0x483AB65: calloc (vg_replace_malloc.c:760)
==1179738==    by 0x493C8D5: qcalloc (memory.c:116)
==1179738==    by 0x208F0C: ecommunity_dup (bgp_ecommunity.c:267)
==1179738==    by 0x2B300C: conf_copy (bgp_updgrp.c:170)
==1179738==    by 0x2B35BF: peer2_updgrp_copy (bgp_updgrp.c:277)
==1179738==    by 0x2B5189: update_group_find (bgp_updgrp.c:826)
==1179738==    by 0x2B70D0: update_group_adjust_peer (bgp_updgrp.c:1769)
==1179738==    by 0x23DB7D: update_group_adjust_peer_afs (bgp_updgrp.h:519)
==1179738==    by 0x243B21: bgp_establish (bgp_fsm.c:2129)
==1179738==    by 0x244B94: bgp_event_update (bgp_fsm.c:2597)
==1179738==    by 0x26B0E6: bgp_process_packet (bgp_packet.c:2895)
==1179738==    by 0x498F5FD: thread_call (thread.c:2008)
==1179738==    by 0x49253DA: frr_run (libfrr.c:1198)
==1179738==    by 0x1EEC38: main (bgp_main.c:520)

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_fsm.c
bgpd/bgp_updgrp.c
bgpd/bgpd.c

index 1164546df7c4a66b2d9f412d635b4f4e710fc092..a8accc25f505f3c33f46141bf38b992b6acefd09 100644 (file)
@@ -300,11 +300,6 @@ static struct peer *peer_xfer_conn(struct peer *from_peer)
                peer->afc_recv[afi][safi] = from_peer->afc_recv[afi][safi];
                peer->orf_plist[afi][safi] = from_peer->orf_plist[afi][safi];
                peer->llgr[afi][safi] = from_peer->llgr[afi][safi];
-               if (from_peer->soo[afi][safi]) {
-                       ecommunity_free(&peer->soo[afi][safi]);
-                       peer->soo[afi][safi] =
-                               ecommunity_dup(from_peer->soo[afi][safi]);
-               }
        }
 
        if (bgp_getsockname(peer) < 0) {
index d198aec983d61b60decd59cea6a8cc590b64ea9c..0219535b0d57b567959148d08b27ff5e691c6399 100644 (file)
@@ -254,6 +254,8 @@ static void conf_release(struct peer *src, afi_t afi, safi_t safi)
        XFREE(MTYPE_BGP_FILTER_NAME, srcfilter->advmap.cname);
 
        XFREE(MTYPE_BGP_PEER_HOST, src->host);
+
+       ecommunity_free(&src->soo[afi][safi]);
 }
 
 static void peer2_updgrp_copy(struct update_group *updgrp, struct peer_af *paf)
index a889a737ebf42b4142c8ccde25839650f2262705..4c151b2d374398862e00ee88758dabfe40b943fd 100644 (file)
@@ -1473,11 +1473,6 @@ void peer_xfer_config(struct peer *peer_dst, struct peer *peer_src)
                peer_dst->weight[afi][safi] = peer_src->weight[afi][safi];
                peer_dst->addpath_type[afi][safi] =
                        peer_src->addpath_type[afi][safi];
-               if (peer_src->soo[afi][safi]) {
-                       ecommunity_free(&peer_dst->soo[afi][safi]);
-                       peer_dst->soo[afi][safi] =
-                               ecommunity_dup(peer_src->soo[afi][safi]);
-               }
        }
 
        for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++) {