On Mon, Jan 04, 2021 at 10:46:39AM +0100, Claudio Jeker wrote: > In bgpd most prefixes and addresses are stored as struct bgpd_addr. When > it is printed it uses inet_ntop() which is not ideal since it does not > handle IPv6 scoped_id. Instead convert to a struct sockaddr and use > log_sockaddr() which in turn uses getnameinfo. > > Ideally the same should be done for the VPN address types but that is a > bit more complex. > > -- > :wq Claudio > > Index: bgpd.h > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v > retrieving revision 1.408 > diff -u -p -r1.408 bgpd.h > --- bgpd.h 30 Dec 2020 07:29:56 -0000 1.408 > +++ bgpd.h 4 Jan 2021 09:34:44 -0000 > @@ -1371,7 +1371,7 @@ int aid2afi(u_int8_t, u_int16_t *, u_i > int afi2aid(u_int16_t, u_int8_t, u_int8_t *); > sa_family_t aid2af(u_int8_t); > int af2aid(sa_family_t, u_int8_t, u_int8_t *); > -struct sockaddr *addr2sa(struct bgpd_addr *, u_int16_t, socklen_t *); > +struct sockaddr *addr2sa(const struct bgpd_addr *, u_int16_t, socklen_t > *); > void sa2addr(struct sockaddr *, struct bgpd_addr *, u_int16_t *); > const char * get_baudrate(unsigned long long, char *); > > Index: util.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/util.c,v > retrieving revision 1.55 > diff -u -p -r1.55 util.c > --- util.c 21 Oct 2020 06:53:54 -0000 1.55 > +++ util.c 4 Jan 2021 09:33:30 -0000 > @@ -39,14 +39,12 @@ log_addr(const struct bgpd_addr *addr) > { > static char buf[74]; > char tbuf[40]; > + socklen_t len; > > switch (addr->aid) { > case AID_INET: > case AID_INET6: > - if (inet_ntop(aid2af(addr->aid), &addr->ba, buf, > - sizeof(buf)) == NULL) > - return ("?"); > - return (buf); > + return log_sockaddr(addr2sa(addr, 0, &len), len);
Perhaps I haven't yet had enough coffee this year, but I'm unsure whether it is actually guaranteed that addr2sa() is called before the second len in this line is passed to log_sockaddr(). > case AID_VPN_IPv4: > if (inet_ntop(AF_INET, &addr->vpn4.addr, tbuf, > sizeof(tbuf)) == NULL) > @@ -838,7 +836,7 @@ af2aid(sa_family_t af, u_int8_t safi, u_ > } > > struct sockaddr * > -addr2sa(struct bgpd_addr *addr, u_int16_t port, socklen_t *len) > +addr2sa(const struct bgpd_addr *addr, u_int16_t port, socklen_t *len) > { > static struct sockaddr_storage ss; > struct sockaddr_in *sa_in = (struct sockaddr_in *)&ss; >