summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorbluhm <bluhm@openbsd.org>2017-05-12 20:34:29 +0000
committerbluhm <bluhm@openbsd.org>2017-05-12 20:34:29 +0000
commit387576dcade7b6166c93659ec2052f9e34df6ddc (patch)
tree30f96653157127aa0a247d9063497584b9e2a7b8 /sys
parentqueue is not owned by _smtpd but _smtpq so a bug in lookup process does not (diff)
downloadwireguard-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.c47
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)