Another diff to ease portability of bgpd. The sa_len field in struct
sockaddr does not exist on Linux so instead of using it pass a length to
the function (e.g. like bind(2) and connect(2) and do the same when
passing around struct sockaddr_storage in the listener case.
The remaining sa_len, sin_len, sin6_len and ss_len usages are in very
OpenBSD specific files.

-- 
:wq Claudio

Index: bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.369
diff -u -p -r1.369 bgpd.h
--- bgpd.h      15 Feb 2019 11:38:06 -0000      1.369
+++ bgpd.h      15 Feb 2019 13:51:28 -0000
@@ -220,11 +220,12 @@ struct bgpd_addr {
 #define        LISTENER_LISTENING      0x02
 
 struct listen_addr {
-       TAILQ_ENTRY(listen_addr)         entry;
-       struct sockaddr_storage          sa;
-       int                              fd;
-       enum reconf_action               reconf;
-       u_int8_t                         flags;
+       TAILQ_ENTRY(listen_addr)        entry;
+       struct sockaddr_storage         sa;
+       int                             fd;
+       enum reconf_action              reconf;
+       socklen_t                       sa_len;
+       u_int8_t                        flags;
 };
 
 TAILQ_HEAD(listen_addrs, listen_addr);
@@ -1254,7 +1255,7 @@ int                        set_equal(const struct 
set_table 
 /* util.c */
 const char     *log_addr(const struct bgpd_addr *);
 const char     *log_in6addr(const struct in6_addr *);
-const char     *log_sockaddr(struct sockaddr *);
+const char     *log_sockaddr(struct sockaddr *, socklen_t);
 const char     *log_as(u_int32_t);
 const char     *log_rd(u_int64_t);
 const char     *log_ext_subtype(u_int8_t, u_int8_t);
@@ -1288,7 +1289,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);
+struct sockaddr        *addr2sa(struct bgpd_addr *, u_int16_t, socklen_t *);
 void            sa2addr(struct sockaddr *, struct bgpd_addr *);
 uint64_t        ift2ifm(uint8_t);
 const char *    get_media_descr(uint64_t);
Index: config.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/config.c,v
retrieving revision 1.81
diff -u -p -r1.81 config.c
--- config.c    12 Feb 2019 09:00:21 -0000      1.81
+++ config.c    15 Feb 2019 13:43:42 -0000
@@ -397,7 +397,7 @@ prepare_listeners(struct bgpd_config *co
                la->fd = -1;
                la->flags = DEFAULT_LISTENER;
                la->reconf = RECONF_REINIT;
-               la->sa.ss_len = sizeof(struct sockaddr_in);
+               la->sa_len = sizeof(struct sockaddr_in);
                ((struct sockaddr_in *)&la->sa)->sin_family = AF_INET;
                ((struct sockaddr_in *)&la->sa)->sin_addr.s_addr =
                    htonl(INADDR_ANY);
@@ -409,7 +409,7 @@ prepare_listeners(struct bgpd_config *co
                la->fd = -1;
                la->flags = DEFAULT_LISTENER;
                la->reconf = RECONF_REINIT;
-               la->sa.ss_len = sizeof(struct sockaddr_in6);
+               la->sa_len = sizeof(struct sockaddr_in6);
                ((struct sockaddr_in6 *)&la->sa)->sin6_family = AF_INET6;
                ((struct sockaddr_in6 *)&la->sa)->sin6_port = htons(BGP_PORT);
                TAILQ_INSERT_TAIL(conf->listen_addrs, la, entry);
@@ -437,24 +437,25 @@ prepare_listeners(struct bgpd_config *co
                    &opt, sizeof(opt)) == -1)
                        fatal("setsockopt SO_REUSEADDR");
 
-               if (bind(la->fd, (struct sockaddr *)&la->sa, la->sa.ss_len) ==
+               if (bind(la->fd, (struct sockaddr *)&la->sa, la->sa_len) ==
                    -1) {
                        switch (la->sa.ss_family) {
                        case AF_INET:
                                log_warn("cannot bind to %s:%u",
-                                   log_sockaddr((struct sockaddr *)&la->sa),
-                                   ntohs(((struct sockaddr_in *)
+                                   log_sockaddr((struct sockaddr *)&la->sa,
+                                   la->sa_len), ntohs(((struct sockaddr_in *)
                                    &la->sa)->sin_port));
                                break;
                        case AF_INET6:
                                log_warn("cannot bind to [%s]:%u",
-                                   log_sockaddr((struct sockaddr *)&la->sa),
-                                   ntohs(((struct sockaddr_in6 *)
+                                   log_sockaddr((struct sockaddr *)&la->sa,
+                                   la->sa_len), ntohs(((struct sockaddr_in6 *)
                                    &la->sa)->sin6_port));
                                break;
                        default:
                                log_warn("cannot bind to %s",
-                                   log_sockaddr((struct sockaddr *)&la->sa));
+                                   log_sockaddr((struct sockaddr *)&la->sa,
+                                   la->sa_len));
                                break;
                        }
                        close(la->fd);
Index: logmsg.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/logmsg.c,v
retrieving revision 1.3
diff -u -p -r1.3 logmsg.c
--- logmsg.c    28 May 2017 20:14:15 -0000      1.3
+++ logmsg.c    15 Feb 2019 13:34:46 -0000
@@ -198,13 +198,13 @@ log_notification(const struct peer *peer
 }
 
 void
-log_conn_attempt(const struct peer *peer, struct sockaddr *sa)
+log_conn_attempt(const struct peer *peer, struct sockaddr *sa, socklen_t len)
 {
        char            *p;
        const char      *b;
 
        if (peer == NULL) {     /* connection from non-peer, drop */
-               b = log_sockaddr(sa);
+               b = log_sockaddr(sa, len);
                logit(LOG_INFO, "connection from non-peer %s refused", b);
        } else {
                /* only log if there is a chance that the session may come up */
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.374
diff -u -p -r1.374 parse.y
--- parse.y     15 Feb 2019 10:10:53 -0000      1.374
+++ parse.y     15 Feb 2019 13:58:06 -0000
@@ -578,13 +578,15 @@ conf_main : AS as4number          {
                }
                | LISTEN ON address     {
                        struct listen_addr      *la;
+                       struct sockaddr         *sa;
 
                        if ((la = calloc(1, sizeof(struct listen_addr))) ==
                            NULL)
                                fatal("parse conf_main listen on calloc");
 
                        la->fd = -1;
-                       memcpy(&la->sa, addr2sa(&$3, BGP_PORT), sizeof(la->sa));
+                       sa = addr2sa(&$3, BGP_PORT, &la->sa_len);
+                       memcpy(&la->sa, sa, la->sa_len);
                        TAILQ_INSERT_TAIL(conf->listen_addrs, la, entry);
                }
                | FIBPRIORITY NUMBER            {
Index: pfkey.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/pfkey.c,v
retrieving revision 1.52
diff -u -p -r1.52 pfkey.c
--- pfkey.c     20 Sep 2018 11:06:04 -0000      1.52
+++ pfkey.c     15 Feb 2019 13:54:36 -0000
@@ -76,6 +76,7 @@ pfkey_send(int sd, uint8_t satype, uint8
        int                     iov_cnt;
        struct sockaddr_storage ssrc, sdst, speer, smask, dmask;
        struct sockaddr         *saptr;
+       socklen_t                salen;
 
        if (!pid)
                pid = getpid();
@@ -83,8 +84,8 @@ pfkey_send(int sd, uint8_t satype, uint8
        /* we need clean sockaddr... no ports set */
        bzero(&ssrc, sizeof(ssrc));
        bzero(&smask, sizeof(smask));
-       if ((saptr = addr2sa(src, 0)))
-               memcpy(&ssrc, saptr, sizeof(ssrc));
+       if ((saptr = addr2sa(src, 0, &salen)))
+               memcpy(&ssrc, saptr, salen);
        switch (src->aid) {
        case AID_INET:
                memset(&((struct sockaddr_in *)&smask)->sin_addr, 0xff, 32/8);
@@ -104,8 +105,8 @@ pfkey_send(int sd, uint8_t satype, uint8
 
        bzero(&sdst, sizeof(sdst));
        bzero(&dmask, sizeof(dmask));
-       if ((saptr = addr2sa(dst, 0)))
-               memcpy(&sdst, saptr, sizeof(sdst));
+       if ((saptr = addr2sa(dst, 0, &salen)))
+               memcpy(&sdst, saptr, salen);
        switch (dst->aid) {
        case AID_INET:
                memset(&((struct sockaddr_in *)&dmask)->sin_addr, 0xff, 32/8);
Index: printconf.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/printconf.c,v
retrieving revision 1.129
diff -u -p -r1.129 printconf.c
--- printconf.c 12 Feb 2019 09:00:56 -0000      1.129
+++ printconf.c 15 Feb 2019 13:45:34 -0000
@@ -367,7 +367,7 @@ print_mainconf(struct bgpd_config *conf)
 
        TAILQ_FOREACH(la, conf->listen_addrs, entry)
                printf("listen on %s\n",
-                   log_sockaddr((struct sockaddr *)&la->sa));
+                   log_sockaddr((struct sockaddr *)&la->sa, la->sa_len));
 
        if (conf->flags & BGPD_FLAG_NEXTHOP_BGP)
                printf("nexthop qualify via bgp\n");
Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
retrieving revision 1.372
diff -u -p -r1.372 session.c
--- session.c   15 Feb 2019 11:38:06 -0000      1.372
+++ session.c   15 Feb 2019 13:53:32 -0000
@@ -145,7 +145,8 @@ setup_listeners(u_int *la_cnt)
 
                if (la->fd == -1) {
                        log_warn("cannot establish listener on %s: invalid fd",
-                           log_sockaddr((struct sockaddr *)&la->sa));
+                           log_sockaddr((struct sockaddr *)&la->sa,
+                           la->sa_len));
                        continue;
                }
 
@@ -179,7 +180,7 @@ setup_listeners(u_int *la_cnt)
                la->flags |= LISTENER_LISTENING;
 
                log_info("listening on %s",
-                   log_sockaddr((struct sockaddr *)&la->sa));
+                   log_sockaddr((struct sockaddr *)&la->sa, la->sa_len));
        }
 
        *la_cnt = cnt;
@@ -1087,7 +1088,7 @@ open:
                /* then do part of the open dance */
                goto open;
        } else {
-               log_conn_attempt(p, (struct sockaddr *)&cliaddr);
+               log_conn_attempt(p, (struct sockaddr *)&cliaddr, len);
                close(connfd);
        }
 }
@@ -1097,6 +1098,7 @@ session_connect(struct peer *peer)
 {
        int                      opt = 1;
        struct sockaddr         *sa;
+       socklen_t                sa_len;
 
        /*
         * we do not need the overcomplicated collision detection RFC 1771
@@ -1137,8 +1139,8 @@ session_connect(struct peer *peer)
        peer->wbuf.fd = peer->fd;
 
        /* if update source is set we need to bind() */
-       if ((sa = addr2sa(&peer->conf.local_addr, 0)) != NULL) {
-               if (bind(peer->fd, sa, sa->sa_len) == -1) {
+       if ((sa = addr2sa(&peer->conf.local_addr, 0, &sa_len)) != NULL) {
+               if (bind(peer->fd, sa, sa_len) == -1) {
                        log_peer_warn(&peer->conf, "session_connect bind");
                        bgp_fsm(peer, EVNT_CON_OPENFAIL);
                        return (-1);
@@ -1150,8 +1152,8 @@ session_connect(struct peer *peer)
                return (-1);
        }
 
-       sa = addr2sa(&peer->conf.remote_addr, BGP_PORT);
-       if (connect(peer->fd, sa, sa->sa_len) == -1) {
+       sa = addr2sa(&peer->conf.remote_addr, BGP_PORT, &sa_len);
+       if (connect(peer->fd, sa, sa_len) == -1) {
                if (errno != EINPROGRESS) {
                        if (errno != peer->lasterr)
                                log_peer_warn(&peer->conf, "connect");
@@ -2695,7 +2697,7 @@ session_dispatch_imsg(struct imsgbuf *ib
                                        log_warnx("expected to receive fd for "
                                            "%s but didn't receive any",
                                            log_sockaddr((struct sockaddr *)
-                                           &nla->sa));
+                                           &nla->sa, nla->sa_len));
 
                                la = calloc(1, sizeof(struct listen_addr));
                                if (la == NULL)
@@ -2777,8 +2779,8 @@ session_dispatch_imsg(struct imsgbuf *ib
                                nla = TAILQ_NEXT(la, entry);
                                if (la->reconf == RECONF_NONE) {
                                        log_info("not listening on %s any more",
-                                           log_sockaddr(
-                                           (struct sockaddr *)&la->sa));
+                                           log_sockaddr((struct sockaddr *)
+                                           &la->sa, la->sa_len));
                                        TAILQ_REMOVE(conf->listen_addrs, la,
                                            entry);
                                        close(la->fd);
Index: session.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.h,v
retrieving revision 1.129
diff -u -p -r1.129 session.h
--- session.h   11 Feb 2019 15:44:25 -0000      1.129
+++ session.h   15 Feb 2019 13:35:11 -0000
@@ -264,7 +264,8 @@ void                 log_statechange(struct peer *, en
                    enum session_events);
 void            log_notification(const struct peer *, u_int8_t, u_int8_t,
                    u_char *, u_int16_t, const char *);
-void            log_conn_attempt(const struct peer *, struct sockaddr *);
+void            log_conn_attempt(const struct peer *, struct sockaddr *,
+                   socklen_t);
 
 /* mrt.c */
 void            mrt_dump_bgp_msg(struct mrt *, void *, u_int16_t,
Index: util.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
retrieving revision 1.43
diff -u -p -r1.43 util.c
--- util.c      15 Feb 2019 09:55:21 -0000      1.43
+++ util.c      15 Feb 2019 13:55:38 -0000
@@ -74,7 +74,6 @@ log_in6addr(const struct in6_addr *addr)
        u_int16_t               tmp16;
 
        bzero(&sa_in6, sizeof(sa_in6));
-       sa_in6.sin6_len = sizeof(sa_in6);
        sa_in6.sin6_family = AF_INET6;
        memcpy(&sa_in6.sin6_addr, addr, sizeof(sa_in6.sin6_addr));
 
@@ -87,15 +86,15 @@ log_in6addr(const struct in6_addr *addr)
                sa_in6.sin6_addr.s6_addr[3] = 0;
        }
 
-       return (log_sockaddr((struct sockaddr *)&sa_in6));
+       return (log_sockaddr((struct sockaddr *)&sa_in6, sizeof(sa_in6)));
 }
 
 const char *
-log_sockaddr(struct sockaddr *sa)
+log_sockaddr(struct sockaddr *sa, socklen_t len)
 {
        static char     buf[NI_MAXHOST];
 
-       if (getnameinfo(sa, sa->sa_len, buf, sizeof(buf), NULL, 0,
+       if (getnameinfo(sa, len, buf, sizeof(buf), NULL, 0,
            NI_NUMERICHOST))
                return ("(unknown)");
        else
@@ -839,7 +838,7 @@ af2aid(sa_family_t af, u_int8_t safi, u_
 }
 
 struct sockaddr *
-addr2sa(struct bgpd_addr *addr, u_int16_t port)
+addr2sa(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;
@@ -852,17 +851,17 @@ addr2sa(struct bgpd_addr *addr, u_int16_
        switch (addr->aid) {
        case AID_INET:
                sa_in->sin_family = AF_INET;
-               sa_in->sin_len = sizeof(struct sockaddr_in);
                sa_in->sin_addr.s_addr = addr->v4.s_addr;
                sa_in->sin_port = htons(port);
+               *len = sizeof(struct sockaddr_in);
                break;
        case AID_INET6:
                sa_in6->sin6_family = AF_INET6;
-               sa_in6->sin6_len = sizeof(struct sockaddr_in6);
                memcpy(&sa_in6->sin6_addr, &addr->v6,
                    sizeof(sa_in6->sin6_addr));
                sa_in6->sin6_port = htons(port);
                sa_in6->sin6_scope_id = addr->scope_id;
+               *len = sizeof(struct sockaddr_in6);
                break;
        }
 

Reply via email to