From d13d137a1baaea39a24d857de54200dca39410b2 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 26 May 2022 14:03:02 +0300 Subject: [PATCH] bgpd: Fix memory leak for BGP community alias in CLI Before: ``` root@spine1-debian-11:~/frr# vtysh -c 'show memory bgpd | include Large Community' Large Community : 100 40 4000 100 4000 Large Community value : 100 12 2400 100 2400 root@spine1-debian-11:~/frr# for x in $(seq 1 100); do vtysh -c 'conf' -c 'bgp community alias 123:123:123 testas' > /dev/null; done root@spine1-debian-11:~/frr# vtysh -c 'show memory bgpd | include Large Community' Large Community : 200 40 8000 200 8000 Large Community value : 200 12 4800 200 4800 root@spine1-debian-11:~/frr# for x in $(seq 1 100); do vtysh -c 'conf' -c 'bgp community alias 123:123:123 testas' > /dev/null; done root@spine1-debian-11:~/frr# vtysh -c 'show memory bgpd | include Large Community' Large Community : 300 40 12000 300 12000 Large Community value : 300 12 7200 300 7200 root@spine1-debian-11:~/frr# ``` After: ``` root@spine1-debian-11:~/frr# vtysh -c 'show memory bgpd | include Large Community' Large Community : 0 40 0 1 56 Large Community display string: 0 8192 0 1 8200 Large Community value : 0 12 0 1 24 root@spine1-debian-11:~/frr# for x in $(seq 1 100); do vtysh -c 'conf' -c 'bgp community alias 123:123:123 testas' > /dev/null; done root@spine1-debian-11:~/frr# vtysh -c 'show memory bgpd | include Large Community' Large Community : 0 40 0 1 56 Large Community display string: 0 8192 0 1 8200 Large Community value : 0 12 0 1 24 root@spine1-debian-11:~/frr# ``` After we call [l]community_str2com(), we should free the memory. Signed-off-by: Donatas Abraitis --- bgpd/bgp_vty.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 9cfec0fe2f..c013160d95 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -1644,8 +1644,21 @@ DEFPY(bgp_community_alias, bgp_community_alias_cmd, struct community_alias ca2; struct community_alias *lookup_community; struct community_alias *lookup_alias; + struct community *comm; + struct lcommunity *lcomm; + uint8_t invalid = 0; - if (!community_str2com(community) && !lcommunity_str2com(community)) { + comm = community_str2com(community); + if (!comm) + invalid++; + community_free(&comm); + + lcomm = lcommunity_str2com(community); + if (!lcomm) + invalid++; + lcommunity_free(&lcomm); + + if (invalid > 1) { vty_out(vty, "Invalid community format\n"); return CMD_WARNING; }