From 0b40dcbe32fd67646eb84ed89c6f4c1477bcc884 Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Mon, 10 Feb 2020 13:24:14 +0000 Subject: [PATCH] Make linux(4) use kern_socketpair(9) instead of going through sys_socketpair(). It's a cleanup; no functional changes. Reviewed by: kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D22814 --- sys/compat/linux/linux_socket.c | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index 7d297733d96..a96436db22b 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -753,25 +753,19 @@ linux_getpeername(struct thread *td, struct linux_getpeername_args *args) int linux_socketpair(struct thread *td, struct linux_socketpair_args *args) { - struct socketpair_args /* { - int domain; - int type; - int protocol; - int *rsv; - } */ bsd_args; - int error; + int domain, error, sv[2], type; - bsd_args.domain = linux_to_bsd_domain(args->domain); - if (bsd_args.domain != PF_LOCAL) + domain = linux_to_bsd_domain(args->domain); + if (domain != PF_LOCAL) return (EAFNOSUPPORT); - bsd_args.type = args->type & LINUX_SOCK_TYPE_MASK; - if (bsd_args.type < 0 || bsd_args.type > LINUX_SOCK_MAX) + type = args->type & LINUX_SOCK_TYPE_MASK; + if (type < 0 || type > LINUX_SOCK_MAX) return (EINVAL); error = linux_set_socket_flags(args->type & ~LINUX_SOCK_TYPE_MASK, - &bsd_args.type); + &type); if (error != 0) return (error); - if (args->protocol != 0 && args->protocol != PF_UNIX) + if (args->protocol != 0 && args->protocol != PF_UNIX) { /* * Use of PF_UNIX as protocol argument is not right, @@ -780,10 +774,16 @@ linux_socketpair(struct thread *td, struct linux_socketpair_args *args) * to FreeBSD one. */ return (EPROTONOSUPPORT); - else - bsd_args.protocol = 0; - bsd_args.rsv = (int *)PTRIN(args->rsv); - return (sys_socketpair(td, &bsd_args)); + } + error = kern_socketpair(td, domain, type, 0, sv); + if (error != 0) + return (error); + error = copyout(sv, PTRIN(args->rsv), 2 * sizeof(int)); + if (error != 0) { + (void)kern_close(td, sv[0]); + (void)kern_close(td, sv[1]); + } + return (error); } #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))