Date: Sun, 19 May 2019 19:05:11 +0200 From: =?UTF-8?B?VMSzbA==?= Coosemans <tijl@FreeBSD.org> To: Dmitry Chagin <dchagin@FreeBSD.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r347533 - in head/sys: compat/linux modules/linux_common Message-ID: <20190519190511.6e8f436c@kalimero.tijl.coosemans.org> In-Reply-To: <201905131748.x4DHmGaH020444@repo.freebsd.org> References: <201905131748.x4DHmGaH020444@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 13 May 2019 17:48:16 +0000 (UTC) Dmitry Chagin <dchagin@FreeBSD.org> wrote: > Author: dchagin > Date: Mon May 13 17:48:16 2019 > New Revision: 347533 > URL: https://svnweb.freebsd.org/changeset/base/347533 > > Log: > Our bsd_to_linux_sockaddr() and linux_to_bsd_sockaddr() functions > alter the userspace sockaddr to convert the format between linux and BSD versions. > That's the minimum 3 of copyin/copyout operations for one syscall. > > Also some syscall uses linux_sa_put() and linux_getsockaddr() when load > sockaddr to userspace or from userspace accordingly. > > To avoid this chaos, especially converting sockaddr in the userspace, > rewrite these 4 functions to convert sockaddr only in kernel and leave > only 2 of this functions. > > Also in order to reduce duplication between MD parts of the Linuxulator put > struct sockaddr conversion functions that are MI out into linux_common module. > > PR: 232920 > MFC after: 2 weeks > Differential Revision: https://reviews.freebsd.org/D20157 > > Modified: > head/sys/compat/linux/linux.c > head/sys/compat/linux/linux.h > head/sys/compat/linux/linux_common.h > head/sys/compat/linux/linux_socket.c > head/sys/compat/linux/linux_socket.h > head/sys/modules/linux_common/Makefile > > Modified: head/sys/compat/linux/linux_socket.c > ============================================================================== > --- head/sys/compat/linux/linux_socket.c Mon May 13 16:38:48 2019 (r347532) > +++ head/sys/compat/linux/linux_socket.c Mon May 13 17:48:16 2019 (r347533) > @@ -1282,6 +1110,8 @@ linux_recvmsg_common(struct thread *td, l_int s, struc > struct mbuf *control = NULL; > struct mbuf **controlp; > struct timeval *ftmvl; > + struct l_sockaddr *lsa; > + struct sockaddr *sa; > l_timeval ltmvl; > caddr_t outbuf; > void *data; > @@ -1305,36 +1135,34 @@ linux_recvmsg_common(struct thread *td, l_int s, struc > return (error); > > if (msg->msg_name) { > - error = linux_to_bsd_sockaddr((struct sockaddr *)msg->msg_name, > - msg->msg_namelen); > - if (error != 0) > - goto bad; > + sa = malloc(msg->msg_namelen, M_SONAME, M_WAITOK); > + msg->msg_name = sa; > } > > uiov = msg->msg_iov; > msg->msg_iov = iov; > controlp = (msg->msg_control != NULL) ? &control : NULL; > - error = kern_recvit(td, s, msg, UIO_USERSPACE, controlp); > + error = kern_recvit(td, s, msg, UIO_SYSSPACE, controlp); > msg->msg_iov = uiov; > if (error != 0) > goto bad; > > - error = bsd_to_linux_msghdr(msg, &linux_msg); > - if (error != 0) > - goto bad; > - > - if (linux_msg.msg_name) { > - error = bsd_to_linux_sockaddr((struct sockaddr *) > - PTRIN(linux_msg.msg_name)); > + if (sa) { sa may be uninitialised here.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190519190511.6e8f436c>