From 61adcf71be1e279f51a747772f2ce2db742b2581 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Sat, 10 Sep 2022 02:28:07 +0300 Subject: [PATCH] bgpd: Fix memory leak for `conf_copy()` - SoO ecommunity ==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 --- bgpd/bgp_fsm.c | 5 ----- bgpd/bgp_updgrp.c | 2 ++ bgpd/bgpd.c | 5 ----- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 1164546df7..a8accc25f5 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -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) { diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index d198aec983..0219535b0d 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -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) diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index a889a737eb..4c151b2d37 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -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++) {