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); }