summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2018-05-16 15:54:03 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2018-05-16 15:59:06 +0200
commitc7ee6c35cb2c7149f6a3ab53cea4d7e212ebe0f6 (patch)
treef2ebef36552e7cf9a95b281c21bbacc37c7d5a15
parentbgpd: remove unnecessary test and allocate a bit earlier (diff)
downloadfrr-c7ee6c35cb2c7149f6a3ab53cea4d7e212ebe0f6.tar.xz
frr-c7ee6c35cb2c7149f6a3ab53cea4d7e212ebe0f6.zip
bgpd: Fix memory leak of ecommunity_ecom2str
The creation of a temporary string for the ecommunity was being leaked when debugging is enabled. Write a bit of code to prevent this. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--bgpd/bgp_ecommunity.c5
-rw-r--r--bgpd/bgp_ecommunity.h1
-rw-r--r--bgpd/bgp_flowspec.c3
3 files changed, 9 insertions, 0 deletions
diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c
index 85b9ffd8c..99fe80f05 100644
--- a/bgpd/bgp_ecommunity.c
+++ b/bgpd/bgp_ecommunity.c
@@ -52,6 +52,11 @@ struct ecommunity *ecommunity_new(void)
sizeof(struct ecommunity));
}
+void ecommunity_strfree(char **s)
+{
+ XFREE(MTYPE_ECOMMUNITY_STR, *s);
+}
+
/* Allocate ecommunities. */
void ecommunity_free(struct ecommunity **ecom)
{
diff --git a/bgpd/bgp_ecommunity.h b/bgpd/bgp_ecommunity.h
index 88bdb5e2a..2f59308d6 100644
--- a/bgpd/bgp_ecommunity.h
+++ b/bgpd/bgp_ecommunity.h
@@ -156,6 +156,7 @@ extern void ecommunity_unintern(struct ecommunity **);
extern unsigned int ecommunity_hash_make(void *);
extern struct ecommunity *ecommunity_str2com(const char *, int, int);
extern char *ecommunity_ecom2str(struct ecommunity *, int, int);
+extern void ecommunity_strfree(char **s);
extern int ecommunity_match(const struct ecommunity *,
const struct ecommunity *);
extern char *ecommunity_str(struct ecommunity *);
diff --git a/bgpd/bgp_flowspec.c b/bgpd/bgp_flowspec.c
index 5db7e3708..6eb1e3988 100644
--- a/bgpd/bgp_flowspec.c
+++ b/bgpd/bgp_flowspec.c
@@ -166,6 +166,9 @@ int bgp_nlri_parse_flowspec(struct peer *peer, struct attr *attr,
BGP_FLOWSPEC_NLRI_STRING_MAX,
"EC{%s}",
s == NULL ? "none" : s);
+
+ if (s)
+ ecommunity_strfree(&s);
}
snprintf(local_string, BGP_FLOWSPEC_NLRI_STRING_MAX,
"FS Rx %s %s %s %s", withdraw ?