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