bgpd: fix memory leaks in route_match_alias

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2021-08-11 12:21:46 +03:00
parent 15bc6a40d3
commit 1ca0a0bc92

View File

@ -1189,27 +1189,38 @@ route_match_alias(void *rule, const struct prefix *prefix, void *object)
struct bgp_path_info *path = object; struct bgp_path_info *path = object;
char **communities; char **communities;
int num; int num;
bool found;
if (path->attr->community) { if (path->attr->community) {
found = false;
frrstr_split(path->attr->community->str, " ", &communities, frrstr_split(path->attr->community->str, " ", &communities,
&num); &num);
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
const char *com2alias = const char *com2alias =
bgp_community2alias(communities[i]); bgp_community2alias(communities[i]);
if (strcmp(alias, com2alias) == 0) if (!found && strcmp(alias, com2alias) == 0)
return RMAP_MATCH; found = true;
XFREE(MTYPE_TMP, communities[i]);
} }
XFREE(MTYPE_TMP, communities);
if (found)
return RMAP_MATCH;
} }
if (path->attr->lcommunity) { if (path->attr->lcommunity) {
found = false;
frrstr_split(path->attr->lcommunity->str, " ", &communities, frrstr_split(path->attr->lcommunity->str, " ", &communities,
&num); &num);
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
const char *com2alias = const char *com2alias =
bgp_community2alias(communities[i]); bgp_community2alias(communities[i]);
if (strcmp(alias, com2alias) == 0) if (!found && strcmp(alias, com2alias) == 0)
return RMAP_MATCH; found = false;
XFREE(MTYPE_TMP, communities[i]);
} }
XFREE(MTYPE_TMP, communities);
if (found)
return RMAP_MATCH;
} }
return RMAP_NOMATCH; return RMAP_NOMATCH;