]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_clist.c
Merge pull request #3502 from donaldsharp/socket_to_me_baby
[mirror_frr.git] / bgpd / bgp_clist.c
index fec4397b73c99d2b42cd3aa9b1a65db64b8c0e4f..c4a20ca23382ca68ba3077575a43106def051eaa 100644 (file)
@@ -65,7 +65,7 @@ static void community_entry_free(struct community_entry *entry)
        switch (entry->style) {
        case COMMUNITY_LIST_STANDARD:
                if (entry->u.com)
-                       community_free(entry->u.com);
+                       community_free(&entry->u.com);
                break;
        case LARGE_COMMUNITY_LIST_STANDARD:
                if (entry->u.lcom)
@@ -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)
 {
-       int len;
        uint32_t comval;
        uint16_t as;
        uint16_t val;
        char *str;
-       char *pnt;
 
        memcpy(&comval, com_nthval(com, i), sizeof(uint32_t));
        comval = ntohl(comval);
 
        switch (comval) {
        case COMMUNITY_INTERNET:
-               len = strlen(" internet");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "internet");
                break;
        case COMMUNITY_GSHUT:
-               len = strlen(" graceful-shutdown");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "graceful-shutdown");
                break;
        case COMMUNITY_ACCEPT_OWN:
-               len = strlen(" accept-own");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "accept-own");
                break;
        case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
-               len = strlen(" route-filter-translated-v4");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR,
+                             "route-filter-translated-v4");
                break;
        case COMMUNITY_ROUTE_FILTER_v4:
-               len = strlen(" route-filter-v4");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "route-filter-v4");
                break;
        case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
-               len = strlen(" route-filter-translated-v6");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR,
+                             "route-filter-translated-v6");
                break;
        case COMMUNITY_ROUTE_FILTER_v6:
-               len = strlen(" route-filter-v6");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "route-filter-v6");
                break;
        case COMMUNITY_LLGR_STALE:
-               len = strlen(" llgr-stale");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "llgr-stale");
                break;
        case COMMUNITY_NO_LLGR:
-               len = strlen(" no-llgr");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-llgr");
                break;
        case COMMUNITY_ACCEPT_OWN_NEXTHOP:
-               len = strlen(" accept-own-nexthop");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "accept-own-nexthop");
                break;
        case COMMUNITY_BLACKHOLE:
-               len = strlen(" blackhole");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "blackhole");
                break;
        case COMMUNITY_NO_EXPORT:
-               len = strlen(" no-export");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-export");
                break;
        case COMMUNITY_NO_ADVERTISE:
-               len = strlen(" no-advertise");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-advertise");
                break;
        case COMMUNITY_LOCAL_AS:
-               len = strlen(" local-AS");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "local-AS");
                break;
        case COMMUNITY_NO_PEER:
-               len = strlen(" 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");
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "no-peer");
                break;
        default:
+               str = XSTRDUP(MTYPE_COMMUNITY_STR, "65536:65535");
                as = (comval >> 16) & 0xFFFF;
                val = comval & 0xFFFF;
-               sprintf(pnt, "%u:%d", as, val);
-               pnt += strlen(pnt);
+               snprintf(str, strlen(str), "%u:%d", as, val);
                break;
        }
 
-       *pnt = '\0';
-
        return str;
 }
 
@@ -974,7 +903,7 @@ int community_list_unset(struct community_list_handler *ch, const char *name,
 
        if (com) {
                entry = community_list_entry_lookup(list, com, direct);
-               community_free(com);
+               community_free(&com);
        } else
                entry = community_list_entry_lookup(list, str, direct);