diff options
author | 2017-05-12 20:34:29 +0000 | |
---|---|---|
committer | 2017-05-12 20:34:29 +0000 | |
commit | 387576dcade7b6166c93659ec2052f9e34df6ddc (patch) | |
tree | 30f96653157127aa0a247d9063497584b9e2a7b8 /sys | |
parent | queue is not owned by _smtpd but _smtpq so a bug in lookup process does not (diff) | |
download | wireguard-openbsd-387576dcade7b6166c93659ec2052f9e34df6ddc.tar.xz wireguard-openbsd-387576dcade7b6166c93659ec2052f9e34df6ddc.zip |
Use the common switch(af) construct for address family specific
code in tcp_usrreq(PRU_CONNECT). Do not access sockaddr_in before
checking the address family. Return EAFNOSUPPORT error in the
default case.
OK mikeb@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet/tcp_usrreq.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index ba38eb76eae..a08cb0372ac 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_usrreq.c,v 1.147 2017/04/05 13:35:18 deraadt Exp $ */ +/* $OpenBSD: tcp_usrreq.c,v 1.148 2017/05/12 20:34:29 bluhm Exp $ */ /* $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */ /* @@ -127,7 +127,6 @@ int tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct proc *p) { - struct sockaddr_in *sin; struct inpcb *inp; struct tcpcb *tp = NULL; int error = 0; @@ -221,33 +220,41 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, * Send initial segment on connection. */ case PRU_CONNECT: - sin = mtod(nam, struct sockaddr_in *); + switch (mtod(nam, struct sockaddr *)->sa_family) { + case AF_INET: { + struct in_addr *addr = + &mtod(nam, struct sockaddr_in *)->sin_addr; + + if ((addr->s_addr == INADDR_ANY) || + (addr->s_addr == INADDR_BROADCAST) || + IN_MULTICAST(addr->s_addr) || + in_broadcast(*addr, inp->inp_rtableid)) { + error = EINVAL; + break; + } + error = in_pcbconnect(inp, nam); + break; + } #ifdef INET6 - if (sin->sin_family == AF_INET6) { - struct in6_addr *in6_addr = &mtod(nam, - struct sockaddr_in6 *)->sin6_addr; + case AF_INET6: { + struct in6_addr *addr6 = + &mtod(nam, struct sockaddr_in6 *)->sin6_addr; - if (IN6_IS_ADDR_UNSPECIFIED(in6_addr) || - IN6_IS_ADDR_MULTICAST(in6_addr) || - IN6_IS_ADDR_V4MAPPED(in6_addr)) { + if (IN6_IS_ADDR_UNSPECIFIED(addr6) || + IN6_IS_ADDR_MULTICAST(addr6) || + IN6_IS_ADDR_V4MAPPED(addr6)) { error = EINVAL; break; } error = in6_pcbconnect(inp, nam); - } else if (sin->sin_family == AF_INET) + break; + } #endif /* INET6 */ - { - if ((sin->sin_addr.s_addr == INADDR_ANY) || - (sin->sin_addr.s_addr == INADDR_BROADCAST) || - IN_MULTICAST(sin->sin_addr.s_addr) || - in_broadcast(sin->sin_addr, inp->inp_rtableid)) { - error = EINVAL; - break; - } - - error = in_pcbconnect(inp, nam); + default: + error = EAFNOSUPPORT; + break; } if (error) |