From 1ca0a0bc9203c69c80ccd9b98ebc41b232b16077 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Wed, 11 Aug 2021 12:21:46 +0300 Subject: [PATCH] bgpd: fix memory leaks in route_match_alias Signed-off-by: Igor Ryzhov --- bgpd/bgp_routemap.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 09dd71c020..0e13b43ec8 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -1189,27 +1189,38 @@ route_match_alias(void *rule, const struct prefix *prefix, void *object) struct bgp_path_info *path = object; char **communities; int num; + bool found; if (path->attr->community) { + found = false; frrstr_split(path->attr->community->str, " ", &communities, &num); for (int i = 0; i < num; i++) { const char *com2alias = bgp_community2alias(communities[i]); - if (strcmp(alias, com2alias) == 0) - return RMAP_MATCH; + if (!found && strcmp(alias, com2alias) == 0) + found = true; + XFREE(MTYPE_TMP, communities[i]); } + XFREE(MTYPE_TMP, communities); + if (found) + return RMAP_MATCH; } if (path->attr->lcommunity) { + found = false; frrstr_split(path->attr->lcommunity->str, " ", &communities, &num); for (int i = 0; i < num; i++) { const char *com2alias = bgp_community2alias(communities[i]); - if (strcmp(alias, com2alias) == 0) - return RMAP_MATCH; + if (!found && strcmp(alias, com2alias) == 0) + found = false; + XFREE(MTYPE_TMP, communities[i]); } + XFREE(MTYPE_TMP, communities); + if (found) + return RMAP_MATCH; } return RMAP_NOMATCH;