On Mon, Apr 17, 2023 at 02:30:40PM +0200, Claudio Jeker wrote: > 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.
Ugh, sorry for missing this. ok tb > > -- > :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); > } >