diff options
| author | rtr <rtr@NetBSD.org> | 2015-04-03 20:01:07 +0000 |
|---|---|---|
| committer | rtr <rtr@NetBSD.org> | 2015-04-03 20:01:07 +0000 |
| commit | 0da58ac00a9b5753aba6c2f4714b9d499759d1f2 (patch) | |
| tree | f85b2abd805d39ad26a562d1836377ec5f5a012d /sys/netinet | |
| parent | 96d58810e5e839733058d3448402f7aac437b4ea (diff) | |
* change pr_bind to accept struct sockaddr * instead of struct mbuf *
* update protocol bind implementations to use/expect sockaddr *
instead of mbuf *
* introduce sockaddr_big struct for storage of addr data passed via
sys_bind; sockaddr_big is of sufficient size and alignment to
accommodate all addr data sizes received.
* modify sys_bind to allocate sockaddr_big instead of using an mbuf.
* bump kernel version to 7.99.9 for change to pr_bind() parameter type.
Patch posted to tech-net@
http://mail-index.netbsd.org/tech-net/2015/03/15/msg005004.html
The choice to use a new structure sockaddr_big has been retained since
changing sockaddr_storage size would lead to unnecessary ABI change. The
use of the new structure does not preclude future work that increases
the size of sockaddr_storage and at that time sockaddr_big may be
trivially replaced.
Tested by mrg@ and myself, discussed with rmind@, posted to tech-net@
Diffstat (limited to 'sys/netinet')
| -rw-r--r-- | sys/netinet/in_pcb.c | 12 | ||||
| -rw-r--r-- | sys/netinet/in_pcb.h | 4 | ||||
| -rw-r--r-- | sys/netinet/raw_ip.c | 16 | ||||
| -rw-r--r-- | sys/netinet/tcp_usrreq.c | 14 | ||||
| -rw-r--r-- | sys/netinet/udp_usrreq.c | 9 |
5 files changed, 28 insertions, 27 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 8f68ca05698..ba2bc311c56 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1,4 +1,4 @@ -/* $NetBSD: in_pcb.c,v 1.155 2014/11/25 19:09:13 seanb Exp $ */ +/* $NetBSD: in_pcb.c,v 1.156 2015/04/03 20:01:07 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -93,7 +93,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.155 2014/11/25 19:09:13 seanb Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.156 2015/04/03 20:01:07 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -401,10 +401,9 @@ in_pcbbind_port(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred) } int -in_pcbbind(void *v, struct mbuf *nam, struct lwp *l) +in_pcbbind(void *v, struct sockaddr_in *sin, struct lwp *l) { struct inpcb *inp = v; - struct sockaddr_in *sin = NULL; /* XXXGCC */ struct sockaddr_in lsin; int error; @@ -416,9 +415,8 @@ in_pcbbind(void *v, struct mbuf *nam, struct lwp *l) if (inp->inp_lport || !in_nullhost(inp->inp_laddr)) return (EINVAL); - if (nam != NULL) { - sin = mtod(nam, struct sockaddr_in *); - if (nam->m_len != sizeof (*sin)) + if (NULL != sin) { + if (sin->sin_len != sizeof(*sin)) return (EINVAL); } else { lsin = *((const struct sockaddr_in *) diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h index 2e824d0da43..a02a5e026cc 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -1,4 +1,4 @@ -/* $NetBSD: in_pcb.h,v 1.55 2014/11/25 15:04:37 seanb Exp $ */ +/* $NetBSD: in_pcb.h,v 1.56 2015/04/03 20:01:07 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -131,7 +131,7 @@ struct inpcb { #ifdef _KERNEL void in_losing(struct inpcb *); int in_pcballoc(struct socket *, void *); -int in_pcbbind(void *, struct mbuf *, struct lwp *); +int in_pcbbind(void *, struct sockaddr_in *, struct lwp *); int in_pcbconnect(void *, struct mbuf *, struct lwp *); void in_pcbdetach(void *); void in_pcbdisconnect(void *); diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index 8049dca8c46..b93e151a6ee 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.146 2014/11/10 18:52:51 maxv Exp $ */ +/* $NetBSD: raw_ip.c,v 1.147 2015/04/03 20:01:07 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.146 2014/11/10 18:52:51 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.147 2015/04/03 20:01:07 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -557,10 +557,10 @@ rip_accept(struct socket *so, struct mbuf *nam) } static int -rip_bind(struct socket *so, struct mbuf *nam, struct lwp *l) +rip_bind(struct socket *so, struct sockaddr *nam, struct lwp *l) { struct inpcb *inp = sotoinpcb(so); - struct sockaddr_in *addr; + struct sockaddr_in *addr = (struct sockaddr_in *)nam; int error = 0; int s; @@ -568,12 +568,10 @@ rip_bind(struct socket *so, struct mbuf *nam, struct lwp *l) KASSERT(inp != NULL); KASSERT(nam != NULL); + if (addr->sin_len != sizeof(*addr)) + return EINVAL; + s = splsoftnet(); - addr = mtod(nam, struct sockaddr_in *); - if (nam->m_len != sizeof(*addr)) { - error = EINVAL; - goto release; - } if (IFNET_EMPTY()) { error = EADDRNOTAVAIL; goto release; diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 13f703684d5..31464c4f066 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.204 2015/03/31 08:47:01 ozaki-r Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.205 2015/04/03 20:01:07 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.204 2015/03/31 08:47:01 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.205 2015/04/03 20:01:07 rtr Exp $"); #include "opt_inet.h" #include "opt_tcp_debug.h" @@ -711,10 +711,14 @@ tcp_accept(struct socket *so, struct mbuf *nam) } static int -tcp_bind(struct socket *so, struct mbuf *nam, struct lwp *l) +tcp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l) { struct inpcb *inp = NULL; struct in6pcb *in6p = NULL; + struct sockaddr_in *sin = (struct sockaddr_in *)nam; +#ifdef INET6 + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam; +#endif /* INET6 */ struct tcpcb *tp = NULL; int s; int error = 0; @@ -732,12 +736,12 @@ tcp_bind(struct socket *so, struct mbuf *nam, struct lwp *l) switch (so->so_proto->pr_domain->dom_family) { #ifdef INET case PF_INET: - error = in_pcbbind(inp, nam, l); + error = in_pcbbind(inp, sin, l); break; #endif #ifdef INET6 case PF_INET6: - error = in6_pcbbind(in6p, nam, l); + error = in6_pcbbind(in6p, sin6, l); if (!error) { /* mapped addr case */ if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr)) diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 4c184ba1843..9da95c0f1ad 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.218 2015/04/03 20:01:07 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.218 2015/04/03 20:01:07 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -905,9 +905,10 @@ udp_accept(struct socket *so, struct mbuf *nam) } static int -udp_bind(struct socket *so, struct mbuf *nam, struct lwp *l) +udp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l) { struct inpcb *inp = sotoinpcb(so); + struct sockaddr_in *sin = (struct sockaddr_in *)nam; int error = 0; int s; @@ -916,7 +917,7 @@ udp_bind(struct socket *so, struct mbuf *nam, struct lwp *l) KASSERT(nam != NULL); s = splsoftnet(); - error = in_pcbbind(inp, nam, l); + error = in_pcbbind(inp, sin, l); splx(s); return error; |
