summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_clist.c24
-rw-r--r--bgpd/bgp_community_alias.c19
-rw-r--r--bgpd/bgp_community_alias.h2
3 files changed, 28 insertions, 17 deletions
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index fd8f51fed3..8b38f4dfa0 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -549,6 +549,8 @@ static bool community_regexp_include(regex_t *reg, struct community *com, int i)
static bool community_regexp_match(struct community *com, regex_t *reg)
{
const char *str;
+ char *regstr;
+ int rv;
/* When there is no communities attribute it is treated as empty
string. */
@@ -557,12 +559,14 @@ static bool community_regexp_match(struct community *com, regex_t *reg)
else
str = community_str(com, false);
+ regstr = bgp_alias2community_str(str);
+
/* Regular expression match. */
- if (regexec(reg, bgp_alias2community_str(str), 0, NULL, 0) == 0)
- return true;
+ rv = regexec(reg, regstr, 0, NULL, 0);
- /* No match. */
- return false;
+ XFREE(MTYPE_TMP, regstr);
+
+ return rv == 0;
}
static char *lcommunity_str_get(struct lcommunity *lcom, int i)
@@ -619,6 +623,8 @@ static bool lcommunity_regexp_include(regex_t *reg, struct lcommunity *lcom,
static bool lcommunity_regexp_match(struct lcommunity *com, regex_t *reg)
{
const char *str;
+ char *regstr;
+ int rv;
/* When there is no communities attribute it is treated as empty
string. */
@@ -627,12 +633,14 @@ static bool lcommunity_regexp_match(struct lcommunity *com, regex_t *reg)
else
str = lcommunity_str(com, false);
+ regstr = bgp_alias2community_str(str);
+
/* Regular expression match. */
- if (regexec(reg, bgp_alias2community_str(str), 0, NULL, 0) == 0)
- return true;
+ rv = regexec(reg, regstr, 0, NULL, 0);
- /* No match. */
- return false;
+ XFREE(MTYPE_TMP, regstr);
+
+ return rv == 0;
}
diff --git a/bgpd/bgp_community_alias.c b/bgpd/bgp_community_alias.c
index 5f45e19a3b..793f3ac9ac 100644
--- a/bgpd/bgp_community_alias.c
+++ b/bgpd/bgp_community_alias.c
@@ -175,22 +175,25 @@ const char *bgp_alias2community(char *alias)
* This is a helper to convert already aliased version
* of communities into numerical-only format.
*/
-const char *bgp_alias2community_str(const char *str)
+char *bgp_alias2community_str(const char *str)
{
char **aliases;
- int num;
+ char *comstr;
+ int num, i;
frrstr_split(str, " ", &aliases, &num);
- const char *communities[num + 1];
+ const char *communities[num];
- for (int i = 0; i < num; i++) {
- communities[i] =
- XSTRDUP(MTYPE_TMP, bgp_alias2community(aliases[i]));
+ for (i = 0; i < num; i++)
+ communities[i] = bgp_alias2community(aliases[i]);
+
+ comstr = frrstr_join(communities, num, " ");
+
+ for (i = 0; i < num; i++)
XFREE(MTYPE_TMP, aliases[i]);
- }
XFREE(MTYPE_TMP, aliases);
- return frrstr_join(communities, num, " ");
+ return comstr;
}
static int bgp_community_alias_vector_walker(struct hash_bucket *bucket,
diff --git a/bgpd/bgp_community_alias.h b/bgpd/bgp_community_alias.h
index fc9eb9f9e4..57cde0ad44 100644
--- a/bgpd/bgp_community_alias.h
+++ b/bgpd/bgp_community_alias.h
@@ -43,7 +43,7 @@ extern void bgp_ca_alias_delete(struct community_alias *ca);
extern int bgp_community_alias_write(struct vty *vty);
extern const char *bgp_community2alias(char *community);
extern const char *bgp_alias2community(char *alias);
-extern const char *bgp_alias2community_str(const char *str);
+extern char *bgp_alias2community_str(const char *str);
extern void bgp_community_alias_command_completion_setup(void);
#endif /* FRR_BGP_COMMUNITY_ALIAS_H */