]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/command_match.c
Merge pull request #5746 from donaldsharp/bgp_sa
[mirror_frr.git] / lib / command_match.c
index a1ae3ac6b993e6a9e956553e4420c1c7909e0c48..0195aebc17f7fd0a76e3ff7e5e3ba5c959389497 100644 (file)
@@ -334,7 +334,7 @@ static enum matcher_rv command_match_r(struct graph_node *start, vector vline,
                status = MATCHER_INCOMPLETE;
 
        // cleanup
-       list_delete_and_null(&next);
+       list_delete(&next);
 
        return status;
 }
@@ -367,7 +367,7 @@ enum matcher_rv command_complete(struct graph *graph, vector vline,
 
        unsigned int idx;
        for (idx = 0; idx < vector_active(vline) && next->count > 0; idx++) {
-               list_delete_and_null(&current);
+               list_delete(&current);
                current = next;
                next = list_new();
                next->del = stack_del;
@@ -458,8 +458,8 @@ enum matcher_rv command_complete(struct graph *graph, vector vline,
                }
        }
 
-       list_delete_and_null(&current);
-       list_delete_and_null(&next);
+       list_delete(&current);
+       list_delete(&next);
 
        return mrv;
 }
@@ -652,7 +652,7 @@ static void del_arglist(struct list *list)
        list_delete_node(list, tail);
 
        // delete the rest of the list as usual
-       list_delete_and_null(&list);
+       list_delete(&list);
 }
 
 /*---------- token level matching functions ----------*/
@@ -714,7 +714,7 @@ static enum match_type match_ipv4(const char *str)
                                dots++;
                                break;
                        }
-                       if (!isdigit((int)*str))
+                       if (!isdigit((unsigned char)*str))
                                return no_match;
 
                        str++;
@@ -723,8 +723,13 @@ static enum match_type match_ipv4(const char *str)
                if (str - sp > 3)
                        return no_match;
 
-               strncpy(buf, sp, str - sp);
-               if (atoi(buf) > 255)
+               memcpy(buf, sp, str - sp);
+
+               int v = atoi(buf);
+
+               if (v > 255)
+                       return no_match;
+               if (v > 0 && buf[0] == '0')
                        return no_match;
 
                nums++;
@@ -765,7 +770,7 @@ static enum match_type match_ipv4_prefix(const char *str)
                                break;
                        }
 
-                       if (!isdigit((int)*str))
+                       if (!isdigit((unsigned char)*str))
                                return no_match;
 
                        str++;
@@ -774,8 +779,13 @@ static enum match_type match_ipv4_prefix(const char *str)
                if (str - sp > 3)
                        return no_match;
 
-               strncpy(buf, sp, str - sp);
-               if (atoi(buf) > 255)
+               memcpy(buf, sp, str - sp);
+
+               int v = atoi(buf);
+
+               if (v > 255)
+                       return no_match;
+               if (v > 0 && buf[0] == '0')
                        return no_match;
 
                if (dots == 3) {
@@ -797,7 +807,7 @@ static enum match_type match_ipv4_prefix(const char *str)
 
        sp = str;
        while (*str != '\0') {
-               if (!isdigit((int)*str))
+               if (!isdigit((unsigned char)*str))
                        return no_match;
 
                str++;