Module Name: src Committed By: christos Date: Fri Mar 16 17:25:04 UTC 2018
Modified Files: src/sys/compat/common: uipc_syscalls_43.c src/sys/compat/linux/common: linux_socket.c src/sys/compat/netbsd32: netbsd32_compat_43.c src/sys/kern: uipc_syscalls.c src/sys/nfs: nfs_syscalls.c nfs_vfsops.c src/sys/sys: param.h socketvar.h Log Message: PR/53103: Timo Buhrmester: linux emulation of sendto(2) broken The sockargs refactoring broke it, because sockargs only works with a user address. Added an argument to sockargs to indicate where the address is coming from. Welcome to 8.99.14. To generate a diff of this commit: cvs rdiff -u -r1.47 -r1.48 src/sys/compat/common/uipc_syscalls_43.c cvs rdiff -u -r1.139 -r1.140 src/sys/compat/linux/common/linux_socket.c cvs rdiff -u -r1.54 -r1.55 src/sys/compat/netbsd32/netbsd32_compat_43.c cvs rdiff -u -r1.191 -r1.192 src/sys/kern/uipc_syscalls.c cvs rdiff -u -r1.159 -r1.160 src/sys/nfs/nfs_syscalls.c cvs rdiff -u -r1.235 -r1.236 src/sys/nfs/nfs_vfsops.c cvs rdiff -u -r1.558 -r1.559 src/sys/sys/param.h cvs rdiff -u -r1.146 -r1.147 src/sys/sys/socketvar.h 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/common/uipc_syscalls_43.c diff -u src/sys/compat/common/uipc_syscalls_43.c:1.47 src/sys/compat/common/uipc_syscalls_43.c:1.48 --- src/sys/compat/common/uipc_syscalls_43.c:1.47 Tue Sep 13 03:01:07 2016 +++ src/sys/compat/common/uipc_syscalls_43.c Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls_43.c,v 1.47 2016/09/13 07:01:07 martin Exp $ */ +/* $NetBSD: uipc_syscalls_43.c,v 1.48 2018/03/16 17:25:04 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1990, 1993 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls_43.c,v 1.47 2016/09/13 07:01:07 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls_43.c,v 1.48 2018/03/16 17:25:04 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -343,7 +343,8 @@ compat_43_sys_sendmsg(struct lwp *l, con msg.msg_iovlen = omsg.msg_iovlen; msg.msg_iov = omsg.msg_iov; - error = sockargs(&nam, omsg.msg_name, omsg.msg_namelen, MT_SONAME); + error = sockargs(&nam, omsg.msg_name, omsg.msg_namelen, + UIO_USERSPACE, MT_SONAME); if (error != 0) return (error); Index: src/sys/compat/linux/common/linux_socket.c diff -u src/sys/compat/linux/common/linux_socket.c:1.139 src/sys/compat/linux/common/linux_socket.c:1.140 --- src/sys/compat/linux/common/linux_socket.c:1.139 Wed Nov 22 05:19:14 2017 +++ src/sys/compat/linux/common/linux_socket.c Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socket.c,v 1.139 2017/11/22 10:19:14 ozaki-r Exp $ */ +/* $NetBSD: linux_socket.c,v 1.140 2018/03/16 17:25:04 christos 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.139 2017/11/22 10:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.140 2018/03/16 17:25:04 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -401,6 +401,7 @@ linux_sys_sendto(struct lwp *l, const st struct msghdr msg; struct iovec aiov; struct sockaddr_big nam; + struct mbuf *m; int bflags; int error; @@ -419,9 +420,13 @@ linux_sys_sendto(struct lwp *l, const st error = linux_get_sa(l, SCARG(uap, s), &nam, SCARG(uap, to), SCARG(uap, tolen)); if (error) - return (error); - msg.msg_name = &nam; - msg.msg_namelen = SCARG(uap, tolen); + return error; + error = sockargs(&m, &nam, nam.sb_len, UIO_SYSSPACE, MT_SONAME); + if (error) + return error; + msg.msg_flags |= MSG_NAMEMBUF; + msg.msg_name = m; + msg.msg_namelen = nam.sb_len; } msg.msg_iov = &aiov; Index: src/sys/compat/netbsd32/netbsd32_compat_43.c diff -u src/sys/compat/netbsd32/netbsd32_compat_43.c:1.54 src/sys/compat/netbsd32/netbsd32_compat_43.c:1.55 --- src/sys/compat/netbsd32/netbsd32_compat_43.c:1.54 Tue Sep 13 03:01:07 2016 +++ src/sys/compat/netbsd32/netbsd32_compat_43.c Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_compat_43.c,v 1.54 2016/09/13 07:01:07 martin Exp $ */ +/* $NetBSD: netbsd32_compat_43.c,v 1.55 2018/03/16 17:25:04 christos Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.54 2016/09/13 07:01:07 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.55 2018/03/16 17:25:04 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_43.h" @@ -529,7 +529,7 @@ compat_43_netbsd32_osendmsg(struct lwp * msg.msg_flags = MSG_NAMEMBUF; error = sockargs(&nam, NETBSD32PTR64(omsg.msg_name), omsg.msg_namelen, - MT_SONAME); + UIO_USERSPACE, MT_SONAME); if (error != 0) goto out; Index: src/sys/kern/uipc_syscalls.c diff -u src/sys/kern/uipc_syscalls.c:1.191 src/sys/kern/uipc_syscalls.c:1.192 --- src/sys/kern/uipc_syscalls.c:1.191 Mon Feb 12 11:01:35 2018 +++ src/sys/kern/uipc_syscalls.c Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.191 2018/02/12 16:01:35 maxv Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.192 2018/03/16 17:25:04 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.191 2018/02/12 16:01:35 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.192 2018/03/16 17:25:04 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_pipe.h" @@ -593,7 +593,7 @@ do_sys_sendmsg_so(struct lwp *l, int s, if (mp->msg_name && to == NULL) { error = sockargs(&to, mp->msg_name, mp->msg_namelen, - MT_SONAME); + UIO_USERSPACE, MT_SONAME); if (error) goto bad; } @@ -605,7 +605,7 @@ do_sys_sendmsg_so(struct lwp *l, int s, } if (control == NULL) { error = sockargs(&control, mp->msg_control, - mp->msg_controllen, MT_CONTROL); + mp->msg_controllen, UIO_USERSPACE, MT_CONTROL); if (error) goto bad; } @@ -1529,7 +1529,8 @@ sockargs_sb(struct sockaddr_big *sb, con * XXX arguments in mbufs, and this could go away. */ int -sockargs(struct mbuf **mp, const void *bf, size_t buflen, int type) +sockargs(struct mbuf **mp, const void *bf, size_t buflen, enum uio_seg seg, + int type) { struct sockaddr *sa; struct mbuf *m; @@ -1560,12 +1561,16 @@ sockargs(struct mbuf **mp, const void *b MEXTMALLOC(m, buflen, M_WAITOK); } m->m_len = buflen; - error = copyin(bf, mtod(m, void *), buflen); - if (error) { - (void)m_free(m); - return error; + if (seg == UIO_USERSPACE) { + error = copyin(bf, mtod(m, void *), buflen); + if (error) { + (void)m_free(m); + return error; + } + ktrkuser(mbuftypes[type], mtod(m, void *), buflen); + } else { + memcpy(mtod(m, void *), bf, buflen); } - ktrkuser(mbuftypes[type], mtod(m, void *), buflen); *mp = m; if (type == MT_SONAME) { sa = mtod(m, struct sockaddr *); Index: src/sys/nfs/nfs_syscalls.c diff -u src/sys/nfs/nfs_syscalls.c:1.159 src/sys/nfs/nfs_syscalls.c:1.160 --- src/sys/nfs/nfs_syscalls.c:1.159 Thu Jan 25 12:14:36 2018 +++ src/sys/nfs/nfs_syscalls.c Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_syscalls.c,v 1.159 2018/01/25 17:14:36 riastradh Exp $ */ +/* $NetBSD: nfs_syscalls.c,v 1.160 2018/03/16 17:25:04 christos Exp $ */ /* * Copyright (c) 1989, 1993 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_syscalls.c,v 1.159 2018/01/25 17:14:36 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_syscalls.c,v 1.160 2018/03/16 17:25:04 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -332,7 +332,7 @@ do_nfssvc(struct nfssvc_copy_ops *ops, s nam = (struct mbuf *)0; else { error = sockargs(&nam, nfsdarg.name, nfsdarg.namelen, - MT_SONAME); + UIO_USERSPACE, MT_SONAME); if (error) { fd_putfile(nfsdarg.sock); return (error); Index: src/sys/nfs/nfs_vfsops.c diff -u src/sys/nfs/nfs_vfsops.c:1.235 src/sys/nfs/nfs_vfsops.c:1.236 --- src/sys/nfs/nfs_vfsops.c:1.235 Mon Apr 17 04:32:01 2017 +++ src/sys/nfs/nfs_vfsops.c Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_vfsops.c,v 1.235 2017/04/17 08:32:01 hannken Exp $ */ +/* $NetBSD: nfs_vfsops.c,v 1.236 2018/03/16 17:25:04 christos Exp $ */ /* * Copyright (c) 1989, 1993, 1995 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_vfsops.c,v 1.235 2017/04/17 08:32:01 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_vfsops.c,v 1.236 2018/03/16 17:25:04 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_nfs.h" @@ -670,7 +670,8 @@ nfs_mount(struct mount *mp, const char * goto free_hst; memset(&hst[len], 0, MNAMELEN - len); /* sockargs() call must be after above copyin() calls */ - error = sockargs(&nam, args->addr, args->addrlen, MT_SONAME); + error = sockargs(&nam, args->addr, args->addrlen, UIO_USERSPACE, + MT_SONAME); if (error) goto free_hst; MCLAIM(nam, &nfs_mowner); Index: src/sys/sys/param.h diff -u src/sys/sys/param.h:1.558 src/sys/sys/param.h:1.559 --- src/sys/sys/param.h:1.558 Wed Mar 14 20:48:13 2018 +++ src/sys/sys/param.h Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.558 2018/03/15 00:48:13 christos Exp $ */ +/* $NetBSD: param.h,v 1.559 2018/03/16 17:25:04 christos Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -67,7 +67,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 899001300 /* NetBSD 8.99.13 */ +#define __NetBSD_Version__ 899001400 /* NetBSD 8.99.14 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__) Index: src/sys/sys/socketvar.h diff -u src/sys/sys/socketvar.h:1.146 src/sys/sys/socketvar.h:1.147 --- src/sys/sys/socketvar.h:1.146 Wed Jan 3 20:42:25 2018 +++ src/sys/sys/socketvar.h Fri Mar 16 13:25:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: socketvar.h,v 1.146 2018/01/04 01:42:25 christos Exp $ */ +/* $NetBSD: socketvar.h,v 1.147 2018/03/16 17:25:04 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -249,11 +249,13 @@ struct msghdr; struct stat; struct knote; struct sockaddr_big; +enum uio_seg; struct mbuf *getsombuf(struct socket *, int); -/* 0x400 is SO_OTIMESTAMP */ -#define SOOPT_TIMESTAMP(o) ((o) & (SO_TIMESTAMP | 0x400)) +#define SOOPT_TIMESTAMP(o) \ + ((o) & (SO_TIMESTAMP | 0x400 /*SO_OTIMESTAMP*/ | \ + SO_TIMESTAMPNS | SO_TIMESTAMPING)) /* * File operations on sockets. @@ -330,7 +332,7 @@ int so_setsockopt(struct lwp *, struct s int soshutdown(struct socket *, int); void sorestart(struct socket *); void sowakeup(struct socket *, struct sockbuf *, int); -int sockargs(struct mbuf **, const void *, size_t, int); +int sockargs(struct mbuf **, const void *, size_t, enum uio_seg, int); int sopoll(struct socket *, int); struct socket *soget(bool); void soput(struct socket *);