Merge pull request #11291 from opensourcerouting/fix/memory_leak_bgp_alias

bgpd: Memory leak for community alias
This commit is contained in:
Donald Sharp 2022-05-26 17:22:00 -04:00 committed by GitHub
commit 7e36aa0830
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 20 deletions

View File

@ -65,7 +65,7 @@ DEFINE_MTYPE(BGPD, AS_LIST, "BGP AS list");
DEFINE_MTYPE(BGPD, AS_FILTER, "BGP AS filter"); DEFINE_MTYPE(BGPD, AS_FILTER, "BGP AS filter");
DEFINE_MTYPE(BGPD, AS_FILTER_STR, "BGP AS filter str"); DEFINE_MTYPE(BGPD, AS_FILTER_STR, "BGP AS filter str");
DEFINE_MTYPE(BGPD, COMMUNITY_ALIAS, "community"); DEFINE_MTYPE(BGPD, COMMUNITY_ALIAS, "community alias");
DEFINE_MTYPE(BGPD, COMMUNITY, "community"); DEFINE_MTYPE(BGPD, COMMUNITY, "community");
DEFINE_MTYPE(BGPD, COMMUNITY_VAL, "community val"); DEFINE_MTYPE(BGPD, COMMUNITY_VAL, "community val");

View File

@ -1640,49 +1640,72 @@ DEFPY(bgp_community_alias, bgp_community_alias_cmd,
"Community (AA:BB or AA:BB:CC)\n" "Community (AA:BB or AA:BB:CC)\n"
"Alias name\n") "Alias name\n")
{ {
struct community_alias ca1; struct community_alias ca = {};
struct community_alias ca2;
struct community_alias *lookup_community; struct community_alias *lookup_community;
struct community_alias *lookup_alias; struct community_alias *lookup_alias;
struct community *comm;
struct lcommunity *lcomm;
uint8_t invalid = 0;
if (!community_str2com(community) && !lcommunity_str2com(community)) { comm = community_str2com(community);
if (!comm)
invalid++;
community_free(&comm);
lcomm = lcommunity_str2com(community);
if (!lcomm)
invalid++;
lcommunity_free(&lcomm);
if (invalid > 1) {
vty_out(vty, "Invalid community format\n"); vty_out(vty, "Invalid community format\n");
return CMD_WARNING; return CMD_WARNING;
} }
memset(&ca1, 0, sizeof(ca1)); strlcpy(ca.community, community, sizeof(ca.community));
memset(&ca2, 0, sizeof(ca2)); strlcpy(ca.alias, alias_name, sizeof(ca.alias));
strlcpy(ca1.community, community, sizeof(ca1.community));
strlcpy(ca1.alias, alias_name, sizeof(ca1.alias));
lookup_community = bgp_ca_community_lookup(&ca1); lookup_community = bgp_ca_community_lookup(&ca);
lookup_alias = bgp_ca_alias_lookup(&ca1); lookup_alias = bgp_ca_alias_lookup(&ca);
if (no) { if (no) {
bgp_ca_alias_delete(&ca1); bgp_ca_alias_delete(&ca);
bgp_ca_community_delete(&ca1); bgp_ca_community_delete(&ca);
} else { } else {
if (lookup_alias) { if (lookup_alias) {
/* Lookup if community hash table has an item /* Lookup if community hash table has an item
* with the same alias name. * with the same alias name.
*/ */
strlcpy(ca2.community, lookup_alias->community, strlcpy(ca.community, lookup_alias->community,
sizeof(ca2.community)); sizeof(ca.community));
if (bgp_ca_community_lookup(&ca2)) { if (bgp_ca_community_lookup(&ca)) {
vty_out(vty, vty_out(vty,
"community (%s) already has this alias (%s)\n", "community (%s) already has this alias (%s)\n",
lookup_alias->community, lookup_alias->community,
lookup_alias->alias); lookup_alias->alias);
return CMD_WARNING; return CMD_WARNING;
} }
bgp_ca_alias_delete(&ca1); bgp_ca_alias_delete(&ca);
} }
if (lookup_community) if (lookup_community) {
bgp_ca_community_delete(&ca1); /* Lookup if alias hash table has an item
* with the same community.
*/
strlcpy(ca.alias, lookup_community->alias,
sizeof(ca.alias));
if (bgp_ca_alias_lookup(&ca)) {
vty_out(vty,
"alias (%s) already has this community (%s)\n",
lookup_community->alias,
lookup_community->community);
return CMD_WARNING;
}
bgp_ca_community_delete(&ca);
}
bgp_ca_alias_insert(&ca1); bgp_ca_alias_insert(&ca);
bgp_ca_community_insert(&ca1); bgp_ca_community_insert(&ca);
} }
return CMD_SUCCESS; return CMD_SUCCESS;