summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2022-09-10 00:52:17 +0300
committerDonatas Abraitis <donatas@opensourcerouting.org>2022-09-10 06:56:01 +0300
commitbbe7bc46f1176c8338a6fb4a0688af0576f0bd7c (patch)
tree918c703fe0346a9d909b7688f2ed3437e383fad8
parentdb391f7d062b4e8a45eb7477f1e96cf3c01a8b89 (diff)
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 <donatas@opensourcerouting.org>
-rw-r--r--bgpd/bgp_route.c16
1 files 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)