Module Name: src Committed By: rtr Date: Sun May 24 17:07:27 UTC 2015
Modified Files: src/sys/compat/linux/common: linux_socket.c Log Message: convert remaining linux_get_sa() users to use linux_get_sa_sb() and pass the pointer to the sockaddr in msghdr.msg_name, while removing the MSG_NAMEMBUF flag. now that the original linux_get_sa() is unused remove it and to make function names consistent again rename linux_get_sa_sb() to linux_get_sa(). To generate a diff of this commit: cvs rdiff -u -r1.124 -r1.125 src/sys/compat/linux/common/linux_socket.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/common/linux_socket.c diff -u src/sys/compat/linux/common/linux_socket.c:1.124 src/sys/compat/linux/common/linux_socket.c:1.125 --- src/sys/compat/linux/common/linux_socket.c:1.124 Sat May 2 17:18:03 2015 +++ src/sys/compat/linux/common/linux_socket.c Sun May 24 17:07:26 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socket.c,v 1.124 2015/05/02 17:18:03 rtr Exp $ */ +/* $NetBSD: linux_socket.c,v 1.125 2015/05/24 17:07:26 rtr Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.124 2015/05/02 17:18:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.125 2015/05/24 17:07:26 rtr Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -119,9 +119,7 @@ int linux_to_bsd_udp_sockopt(int); int linux_getifname(struct lwp *, register_t *, void *); int linux_getifconf(struct lwp *, register_t *, void *); int linux_getifhwaddr(struct lwp *, register_t *, u_int, void *); -static int linux_get_sa(struct lwp *, int, struct mbuf **, - const struct osockaddr *, unsigned int); -static int linux_get_sa_sb(struct lwp *, int, struct sockaddr_big *, +static int linux_get_sa(struct lwp *, int, struct sockaddr_big *, const struct osockaddr *, socklen_t); static int linux_sa_put(struct osockaddr *osa); static int linux_to_bsd_msg_flags(int); @@ -401,7 +399,7 @@ linux_sys_sendto(struct lwp *l, const st } */ struct msghdr msg; struct iovec aiov; - struct mbuf *nam; + struct sockaddr_big nam; int bflags; int error; @@ -421,8 +419,7 @@ linux_sys_sendto(struct lwp *l, const st SCARG(uap, tolen)); if (error) return (error); - msg.msg_flags |= MSG_NAMEMBUF; - msg.msg_name = nam; + msg.msg_name = &nam; msg.msg_namelen = SCARG(uap, tolen); } @@ -470,7 +467,7 @@ linux_sys_sendmsg(struct lwp *l, const s struct linux_msghdr lmsg; int error; int bflags; - struct mbuf *nam; + struct sockaddr_big nam; u_int8_t *control; struct mbuf *ctl_mbuf = NULL; @@ -495,8 +492,7 @@ linux_sys_sendmsg(struct lwp *l, const s msg.msg_namelen); if (error) return (error); - msg.msg_flags |= MSG_NAMEMBUF; - msg.msg_name = nam; + msg.msg_name = &nam; } /* @@ -1404,7 +1400,7 @@ linux_sys_connect(struct lwp *l, const s int error; struct sockaddr_big sb; - error = linux_get_sa_sb(l, SCARG(uap, s), &sb, SCARG(uap, name), + error = linux_get_sa(l, SCARG(uap, s), &sb, SCARG(uap, name), SCARG(uap, namelen)); if (error) return (error); @@ -1449,7 +1445,7 @@ linux_sys_bind(struct lwp *l, const stru int error; struct sockaddr_big sb; - error = linux_get_sa_sb(l, SCARG(uap, s), &sb, SCARG(uap, name), + error = linux_get_sa(l, SCARG(uap, s), &sb, SCARG(uap, name), SCARG(uap, namelen)); if (error) return (error); @@ -1495,8 +1491,12 @@ linux_sys_getpeername(struct lwp *l, con return (0); } +/* + * Copy the osockaddr structure pointed to by name to sb, adjust + * family and convert to sockaddr. + */ static int -linux_get_sa_sb(struct lwp *l, int s, struct sockaddr_big *sb, +linux_get_sa(struct lwp *l, int s, struct sockaddr_big *sb, const struct osockaddr *name, socklen_t namelen) { int error, bdom; @@ -1566,122 +1566,6 @@ linux_get_sa_sb(struct lwp *l, int s, st return 0; } -/* - * Copy the osockaddr structure pointed to by osa to mbuf, adjust - * family and convert to sockaddr. - */ -static int -linux_get_sa(struct lwp *l, int s, struct mbuf **mp, - const struct osockaddr *osa, unsigned int salen) -{ - int error, bdom; - struct sockaddr *sa; - struct osockaddr *kosa; - struct mbuf *m; - - if (salen == 1 || salen > UCHAR_MAX) { - DPRINTF(("bad osa=%p salen=%d\n", osa, salen)); - return EINVAL; - } - - /* We'll need the address in an mbuf later, so copy into one here */ - m = m_get(M_WAIT, MT_SONAME); - if (salen > MLEN) - MEXTMALLOC(m, salen, M_WAITOK); - - m->m_len = salen; - - if (salen == 0) { - *mp = m; - return 0; - } - - kosa = mtod(m, void *); - if ((error = copyin(osa, kosa, salen))) { - DPRINTF(("error %d copying osa %p len %d\n", - error, osa, salen)); - goto bad; - } - - ktrkuser("linux/sockaddr", kosa, salen); - - bdom = linux_to_bsd_domain(kosa->sa_family); - if (bdom == -1) { - DPRINTF(("bad linux family=%d\n", kosa->sa_family)); - error = EINVAL; - goto bad; - } - - /* - * If the family is unspecified, use address family of the socket. - * This avoid triggering strict family checks in netinet/in_pcb.c et.al. - */ - if (bdom == AF_UNSPEC) { - struct socket *so; - - /* fd_getsock() will use the descriptor for us */ - if ((error = fd_getsock(s, &so)) != 0) - goto bad; - - bdom = so->so_proto->pr_domain->dom_family; - fd_putfile(s); - - DPRINTF(("AF_UNSPEC family adjusted to %d\n", bdom)); - } - - /* - * Older Linux IPv6 code uses obsolete RFC2133 struct sockaddr_in6, - * which lacks the scope id compared with RFC2553 one. If we detect - * the situation, reject the address and write a message to system log. - * - * Still accept addresses for which the scope id is not used. - */ - if (bdom == AF_INET6 && salen == sizeof (struct sockaddr_in6) - sizeof (u_int32_t)) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)kosa; - if (!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) && - (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) || - IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) || - IN6_IS_ADDR_V4COMPAT(&sin6->sin6_addr) || - IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) || - IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))) { - struct proc *p = l->l_proc; - int uid = l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1; - - log(LOG_DEBUG, - "pid %d (%s), uid %d: obsolete pre-RFC2553 " - "sockaddr_in6 rejected", - p->p_pid, p->p_comm, uid); - error = EINVAL; - goto bad; - } - salen = sizeof (struct sockaddr_in6); - sin6->sin6_scope_id = 0; - } - - if (bdom == AF_INET) - salen = sizeof(struct sockaddr_in); - - sa = (struct sockaddr *) kosa; - sa->sa_family = bdom; - sa->sa_len = salen; - m->m_len = salen; - ktrkuser("mbsoname", kosa, salen); - -#ifdef DEBUG_LINUX - DPRINTF(("family %d, len = %d [ ", sa->sa_family, sa->sa_len)); - for (bdom = 0; bdom < sizeof(sa->sa_data); bdom++) - DPRINTF(("%02x ", (unsigned char) sa->sa_data[bdom])); - DPRINTF(("\n")); -#endif - - *mp = m; - return 0; - - bad: - m_free(m); - return error; -} - static int linux_sa_put(struct osockaddr *osa) {