summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2019-02-18 09:43:57 +0000
committerclaudio <claudio@openbsd.org>2019-02-18 09:43:57 +0000
commit255fe563d1ca6a4474a5f52dbaea53d72102813c (patch)
treeaad4c97f6827d4b4cf9481208d816a8fdb9735f9
parentregen (diff)
downloadwireguard-openbsd-255fe563d1ca6a4474a5f52dbaea53d72102813c.tar.xz
wireguard-openbsd-255fe563d1ca6a4474a5f52dbaea53d72102813c.zip
Do not depend on the length field of struct sockaddr instead pass the
length to the various functions needing it. Helps portability. OK benno@
-rw-r--r--usr.sbin/bgpd/bgpd.h17
-rw-r--r--usr.sbin/bgpd/config.c19
-rw-r--r--usr.sbin/bgpd/logmsg.c6
-rw-r--r--usr.sbin/bgpd/parse.y6
-rw-r--r--usr.sbin/bgpd/pfkey.c11
-rw-r--r--usr.sbin/bgpd/printconf.c4
-rw-r--r--usr.sbin/bgpd/session.c24
-rw-r--r--usr.sbin/bgpd/session.h5
-rw-r--r--usr.sbin/bgpd/util.c15
9 files changed, 57 insertions, 50 deletions
diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h
index 1cfdb41cb6f..57c50614739 100644
--- a/usr.sbin/bgpd/bgpd.h
+++ b/usr.sbin/bgpd/bgpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.h,v 1.369 2019/02/15 11:38:06 claudio Exp $ */
+/* $OpenBSD: bgpd.h,v 1.370 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -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_int8_t *);
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);
diff --git a/usr.sbin/bgpd/config.c b/usr.sbin/bgpd/config.c
index 214f22e5f7b..b4d57be3524 100644
--- a/usr.sbin/bgpd/config.c
+++ b/usr.sbin/bgpd/config.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: config.c,v 1.81 2019/02/12 09:00:21 claudio Exp $ */
+/* $OpenBSD: config.c,v 1.82 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@@ -397,7 +397,7 @@ prepare_listeners(struct bgpd_config *conf)
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 *conf)
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 *conf)
&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);
diff --git a/usr.sbin/bgpd/logmsg.c b/usr.sbin/bgpd/logmsg.c
index 00ff515fca5..a75386aa4d6 100644
--- a/usr.sbin/bgpd/logmsg.c
+++ b/usr.sbin/bgpd/logmsg.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: logmsg.c,v 1.3 2017/05/28 20:14:15 claudio Exp $ */
+/* $OpenBSD: logmsg.c,v 1.4 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -198,13 +198,13 @@ log_notification(const struct peer *peer, u_int8_t errcode, u_int8_t subcode,
}
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 */
diff --git a/usr.sbin/bgpd/parse.y b/usr.sbin/bgpd/parse.y
index 148410d4a55..42811991369 100644
--- a/usr.sbin/bgpd/parse.y
+++ b/usr.sbin/bgpd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.374 2019/02/15 10:10:53 claudio Exp $ */
+/* $OpenBSD: parse.y,v 1.375 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -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 {
diff --git a/usr.sbin/bgpd/pfkey.c b/usr.sbin/bgpd/pfkey.c
index 509af578a85..1d6f82d1ace 100644
--- a/usr.sbin/bgpd/pfkey.c
+++ b/usr.sbin/bgpd/pfkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfkey.c,v 1.52 2018/09/20 11:06:04 benno Exp $ */
+/* $OpenBSD: pfkey.c,v 1.53 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -76,6 +76,7 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
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_t mtype, uint8_t dir,
/* 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_t mtype, uint8_t dir,
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);
diff --git a/usr.sbin/bgpd/printconf.c b/usr.sbin/bgpd/printconf.c
index 310fbd7185f..92cb76d1b4e 100644
--- a/usr.sbin/bgpd/printconf.c
+++ b/usr.sbin/bgpd/printconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: printconf.c,v 1.129 2019/02/12 09:00:56 claudio Exp $ */
+/* $OpenBSD: printconf.c,v 1.130 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -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");
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c
index 372ee46ef1d..c7fe51b7e06 100644
--- a/usr.sbin/bgpd/session.c
+++ b/usr.sbin/bgpd/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.372 2019/02/15 11:38:06 claudio Exp $ */
+/* $OpenBSD: session.c,v 1.373 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@@ -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 *ibuf, int idx, u_int *listener_cnt)
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 *ibuf, int idx, u_int *listener_cnt)
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);
diff --git a/usr.sbin/bgpd/session.h b/usr.sbin/bgpd/session.h
index e55f21805b0..0ce1e8bdf66 100644
--- a/usr.sbin/bgpd/session.h
+++ b/usr.sbin/bgpd/session.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.h,v 1.129 2019/02/11 15:44:25 claudio Exp $ */
+/* $OpenBSD: session.h,v 1.130 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -264,7 +264,8 @@ void log_statechange(struct peer *, enum session_state,
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,
diff --git a/usr.sbin/bgpd/util.c b/usr.sbin/bgpd/util.c
index 1aa665f2b99..03e7dcfd92c 100644
--- a/usr.sbin/bgpd/util.c
+++ b/usr.sbin/bgpd/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.43 2019/02/15 09:55:21 claudio Exp $ */
+/* $OpenBSD: util.c,v 1.44 2019/02/18 09:43:57 claudio Exp $ */
/*
* Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
@@ -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_int8_t *aid)
}
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_t port)
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;
}