From bbe7bc46f1176c8338a6fb4a0688af0576f0bd7c Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Sat, 10 Sep 2022 00:52:17 +0300 Subject: [PATCH] bgpd: Fix memory leak for `as-override` ==536197== 400 (160 direct, 240 indirect) bytes in 4 blocks are definitely lost in loss record 19 of 21 ==536197== at 0x483DD99: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==536197== by 0x491C753: qcalloc (memory.c:116) ==536197== by 0x303FA9: aspath_dup (bgp_aspath.c:698) ==536197== by 0x304B2A: aspath_replace_specific_asn (bgp_aspath.c:1219) ==536197== by 0x256840: bgp_peer_as_override (bgp_route.c:1781) ==536197== by 0x256840: subgroup_announce_check (bgp_route.c:2216) ==536197== by 0x258345: subgroup_process_announce_selected (bgp_route.c:2804) ==536197== by 0x27F2CA: group_announce_route_walkcb (bgp_updgrp_adv.c:199) ==536197== by 0x4905A51: hash_walk (hash.c:285) ==536197== by 0x27E8D1: update_group_af_walk (bgp_updgrp.c:1866) ==536197== by 0x2809D3: group_announce_route (bgp_updgrp_adv.c:1022) ==536197== by 0x257DC4: bgp_process_main_one (bgp_route.c:3189) ==536197== by 0x257DC4: bgp_process_main_one (bgp_route.c:2975) ==536197== by 0x2581F7: bgp_process_wq (bgp_route.c:3330) ==536197== by 0x4961787: work_queue_run (workqueue.c:285) ==536197== by 0x4957745: thread_call (thread.c:2008) ==536197== by 0x4910B77: frr_run (libfrr.c:1198) ==536197== by 0x1ED6AC: main (bgp_main.c:520) Signed-off-by: Donatas Abraitis --- bgpd/bgp_route.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index eaf4201844..365f13324d 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -1776,10 +1776,20 @@ static void bgp_peer_remove_private_as(struct bgp *bgp, afi_t afi, safi_t safi, static void bgp_peer_as_override(struct bgp *bgp, afi_t afi, safi_t safi, struct peer *peer, struct attr *attr) { + struct aspath *aspath; + if (peer->sort == BGP_PEER_EBGP && - peer_af_flag_check(peer, afi, safi, PEER_FLAG_AS_OVERRIDE)) - attr->aspath = aspath_replace_specific_asn(attr->aspath, - peer->as, bgp->as); + peer_af_flag_check(peer, afi, safi, PEER_FLAG_AS_OVERRIDE)) { + if (attr->aspath->refcnt) + aspath = aspath_dup(attr->aspath); + else + aspath = attr->aspath; + + attr->aspath = aspath_intern( + aspath_replace_specific_asn(aspath, peer->as, bgp->as)); + + aspath_free(aspath); + } } void bgp_attr_add_llgr_community(struct attr *attr) -- 2.39.5