bgpd: fix odd memory mgmt in clist strings fn

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
Quentin Young 2018-08-02 17:27:41 +00:00
parent 46a9c3af89
commit aeab4a8013

View File

@ -332,141 +332,70 @@ community_list_entry_lookup(struct community_list *list, const void *arg,
static char *community_str_get(struct community *com, int i) static char *community_str_get(struct community *com, int i)
{ {
int len;
uint32_t comval; uint32_t comval;
uint16_t as; uint16_t as;
uint16_t val; uint16_t val;
char *str; char *str;
char *pnt;
memcpy(&comval, com_nthval(com, i), sizeof(uint32_t)); memcpy(&comval, com_nthval(com, i), sizeof(uint32_t));
comval = ntohl(comval); comval = ntohl(comval);
switch (comval) { switch (comval) {
case COMMUNITY_INTERNET: case COMMUNITY_INTERNET:
len = strlen(" internet"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "internet");
break; break;
case COMMUNITY_GSHUT: case COMMUNITY_GSHUT:
len = strlen(" graceful-shutdown"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "graceful-shutdown");
break; break;
case COMMUNITY_ACCEPT_OWN: case COMMUNITY_ACCEPT_OWN:
len = strlen(" accept-own"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "accept-own");
break; break;
case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4: case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
len = strlen(" route-filter-translated-v4"); str = XSTRDUP(MTYPE_COMMUNITY_STR,
"route-filter-translated-v4");
break; break;
case COMMUNITY_ROUTE_FILTER_v4: case COMMUNITY_ROUTE_FILTER_v4:
len = strlen(" route-filter-v4"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "route-filter-v4");
break; break;
case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6: case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
len = strlen(" route-filter-translated-v6"); str = XSTRDUP(MTYPE_COMMUNITY_STR,
"route-filter-translated-v6");
break; break;
case COMMUNITY_ROUTE_FILTER_v6: case COMMUNITY_ROUTE_FILTER_v6:
len = strlen(" route-filter-v6"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "route-filter-v6");
break; break;
case COMMUNITY_LLGR_STALE: case COMMUNITY_LLGR_STALE:
len = strlen(" llgr-stale"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "llgr-stale");
break; break;
case COMMUNITY_NO_LLGR: case COMMUNITY_NO_LLGR:
len = strlen(" no-llgr"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-llgr");
break; break;
case COMMUNITY_ACCEPT_OWN_NEXTHOP: case COMMUNITY_ACCEPT_OWN_NEXTHOP:
len = strlen(" accept-own-nexthop"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "accept-own-nexthop");
break; break;
case COMMUNITY_BLACKHOLE: case COMMUNITY_BLACKHOLE:
len = strlen(" blackhole"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "blackhole");
break; break;
case COMMUNITY_NO_EXPORT: case COMMUNITY_NO_EXPORT:
len = strlen(" no-export"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-export");
break; break;
case COMMUNITY_NO_ADVERTISE: case COMMUNITY_NO_ADVERTISE:
len = strlen(" no-advertise"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-advertise");
break; break;
case COMMUNITY_LOCAL_AS: case COMMUNITY_LOCAL_AS:
len = strlen(" local-AS"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "local-AS");
break; break;
case COMMUNITY_NO_PEER: case COMMUNITY_NO_PEER:
len = strlen(" no-peer"); str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-peer");
break;
default:
len = strlen(" 65536:65535");
break;
}
/* Allocate memory. */
str = pnt = XMALLOC(MTYPE_COMMUNITY_STR, len);
switch (comval) {
case COMMUNITY_INTERNET:
strcpy(pnt, "internet");
pnt += strlen("internet");
break;
case COMMUNITY_GSHUT:
strcpy(pnt, "graceful-shutdown");
pnt += strlen("graceful-shutdown");
break;
case COMMUNITY_ACCEPT_OWN:
strcpy(pnt, "accept-own");
pnt += strlen("accept-own");
break;
case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
strcpy(pnt, "route-filter-translated-v4");
pnt += strlen("route-filter-translated-v4");
break;
case COMMUNITY_ROUTE_FILTER_v4:
strcpy(pnt, "route-filter-v4");
pnt += strlen("route-filter-v4");
break;
case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
strcpy(pnt, "route-filter-translated-v6");
pnt += strlen("route-filter-translated-v6");
break;
case COMMUNITY_ROUTE_FILTER_v6:
strcpy(pnt, "route-filter-v6");
pnt += strlen("route-filter-v6");
break;
case COMMUNITY_LLGR_STALE:
strcpy(pnt, "llgr-stale");
pnt += strlen("llgr-stale");
break;
case COMMUNITY_NO_LLGR:
strcpy(pnt, "no-llgr");
pnt += strlen("no-llgr");
break;
case COMMUNITY_ACCEPT_OWN_NEXTHOP:
strcpy(pnt, "accept-own-nexthop");
pnt += strlen("accept-own-nexthop");
break;
case COMMUNITY_BLACKHOLE:
strcpy(pnt, "blackhole");
pnt += strlen("blackhole");
break;
case COMMUNITY_NO_EXPORT:
strcpy(pnt, "no-export");
pnt += strlen("no-export");
break;
case COMMUNITY_NO_ADVERTISE:
strcpy(pnt, "no-advertise");
pnt += strlen("no-advertise");
break;
case COMMUNITY_LOCAL_AS:
strcpy(pnt, "local-AS");
pnt += strlen("local-AS");
break;
case COMMUNITY_NO_PEER:
strcpy(pnt, "no-peer");
pnt += strlen("no-peer");
break; break;
default: default:
str = XSTRDUP(MTYPE_COMMUNITY_STR, "65536:65535");
as = (comval >> 16) & 0xFFFF; as = (comval >> 16) & 0xFFFF;
val = comval & 0xFFFF; val = comval & 0xFFFF;
sprintf(pnt, "%u:%d", as, val); snprintf(str, strlen(str), "%u:%d", as, val);
pnt += strlen(pnt);
break; break;
} }
*pnt = '\0';
return str; return str;
} }