Forgot this bit in the 'bgpctl show rib 192.0.2.1 detail' support I
commited this weekend.

The problem is that parse_prefix() is entered with 'detail' as argument
and clears the previously set address. So be more careful and only modify
the addr pointer if parse_prefix() and parse_addr() are successful.

-- 
:wq Claudio

Index: parser.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/parser.c,v
retrieving revision 1.127
diff -u -p -r1.127 parser.c
--- parser.c    17 Apr 2023 11:02:40 -0000      1.127
+++ parser.c    17 Apr 2023 12:29:29 -0000
@@ -876,10 +876,10 @@ parse_addr(const char *word, struct bgpd
        if (word == NULL)
                return (0);
 
-       memset(addr, 0, sizeof(struct bgpd_addr));
        memset(&ina, 0, sizeof(ina));
 
        if (inet_net_pton(AF_INET, word, &ina, sizeof(ina)) != -1) {
+               memset(addr, 0, sizeof(*addr));
                addr->aid = AID_INET;
                addr->v4 = ina;
                return (1);
@@ -902,6 +902,7 @@ int
 parse_prefix(const char *word, size_t wordlen, struct bgpd_addr *addr,
     uint8_t *prefixlen)
 {
+       struct bgpd_addr tmp;
        char            *p, *ps;
        const char      *errstr;
        int              mask = -1;
@@ -909,7 +910,7 @@ parse_prefix(const char *word, size_t wo
        if (word == NULL)
                return (0);
 
-       memset(addr, 0, sizeof(struct bgpd_addr));
+       memset(&tmp, 0, sizeof(tmp));
 
        if ((p = strrchr(word, '/')) != NULL) {
                size_t plen = strlen(p);
@@ -921,17 +922,17 @@ parse_prefix(const char *word, size_t wo
                        err(1, "parse_prefix: malloc");
                strlcpy(ps, word, wordlen - plen + 1);
 
-               if (parse_addr(ps, addr) == 0) {
+               if (parse_addr(ps, &tmp) == 0) {
                        free(ps);
                        return (0);
                }
 
                free(ps);
        } else
-               if (parse_addr(word, addr) == 0)
+               if (parse_addr(word, &tmp) == 0)
                        return (0);
 
-       switch (addr->aid) {
+       switch (tmp.aid) {
        case AID_INET:
                if (mask == -1)
                        mask = 32;
@@ -946,7 +947,7 @@ parse_prefix(const char *word, size_t wo
                return (0);
        }
 
-       applymask(addr, addr, mask);
+       applymask(addr, &tmp, mask);
        *prefixlen = mask;
        return (1);
 }

Reply via email to