Like in the session engine do not inline the addr2sa call into connect and
authorclaudio <claudio@openbsd.org>
Mon, 3 May 2021 13:18:06 +0000 (13:18 +0000)
committerclaudio <claudio@openbsd.org>
Mon, 3 May 2021 13:18:06 +0000 (13:18 +0000)
bind. The len argument is modified by addr2sa but is also used as argument
in the call and it is undefined if the value of len in connect is set to
the value "returned" by addr2sa().
Should fix connect issues seen on Linux system.
OK denis@

usr.sbin/bgpd/bgpd.c

index e6bf4c8..72233aa 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bgpd.c,v 1.234 2021/02/16 08:29:16 claudio Exp $ */
+/*     $OpenBSD: bgpd.c,v 1.235 2021/05/03 13:18:06 claudio Exp $ */
 
 /*
  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -1261,6 +1261,7 @@ imsg_send_sockets(struct imsgbuf *se, struct imsgbuf *rde, struct imsgbuf *roa)
 void
 bgpd_rtr_connect(struct rtr_config *r)
 {
+       struct sockaddr *sa;
        socklen_t len;
        int fd;
 
@@ -1270,8 +1271,8 @@ bgpd_rtr_connect(struct rtr_config *r)
                log_warn("rtr %s", r->descr);
                return;
        }
-       if (r->local_addr.aid != AID_UNSPEC) {
-               if (bind(fd,  addr2sa(&r->local_addr, 0, &len), len) == -1) {
+       if ((sa = addr2sa(&r->local_addr, 0, &len)) != NULL) {
+               if (bind(fd, sa, len) == -1) {
                        log_warn("rtr %s: bind to %s", r->descr,
                            log_addr(&r->local_addr));
                        close(fd);
@@ -1279,8 +1280,8 @@ bgpd_rtr_connect(struct rtr_config *r)
                }
        }
 
-       if (connect(fd, addr2sa(&r->remote_addr, r->remote_port, &len), len) ==
-           -1) {
+       sa = addr2sa(&r->remote_addr, r->remote_port, &len);
+       if (connect(fd, sa, len) == -1) {
                log_warn("rtr %s: connect to %s:%u", r->descr,
                    log_addr(&r->remote_addr), r->remote_port);
                close(fd);