svn commit: r347533 - in head/sys: compat/linux modules/linux_common

Dmitry Chagin dchagin at freebsd.org
Mon May 20 08:31:03 UTC 2019


вс, 19 мая 2019 г. в 20:05, Tijl Coosemans <tijl at freebsd.org>:

> On Mon, 13 May 2019 17:48:16 +0000 (UTC) Dmitry Chagin
> <dchagin at 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.
>

yes, I see. thank you. also sa leaks if kern_recvit() returns error. will
fix


More information about the svn-src-head mailing list