]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix memory leaks in route_match_alias
authorIgor Ryzhov <iryzhov@nfware.com>
Wed, 11 Aug 2021 09:21:46 +0000 (12:21 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Fri, 13 Aug 2021 11:28:41 +0000 (14:28 +0300)
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
bgpd/bgp_routemap.c

index 09dd71c0205db663675e758b911b9a6a659b6ed8..0e13b43ec8255ec30402247951fe6f8bb0535179 100644 (file)
@@ -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;