git: 26700ac0c4d0 - main - linux(4): Deduplicate execve
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 23 May 2022 10:20:16 UTC
The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=26700ac0c4d0466c00f944bde9613d18625d1f91 commit 26700ac0c4d0466c00f944bde9613d18625d1f91 Author: Dmitry Chagin <dchagin@FreeBSD.org> AuthorDate: 2022-05-23 10:18:41 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2022-05-23 10:18:41 +0000 linux(4): Deduplicate execve As linux_execve is common across archs, except amd64 32-bit Linuxulator, move it under compat/linux. Noted by: andrew@ MFC after: 2 weeks --- sys/amd64/linux/linux_machdep.c | 27 --------------------------- sys/arm64/linux/linux_machdep.c | 30 ------------------------------ sys/compat/linux/linux_misc.c | 28 ++++++++++++++++++++++++++++ sys/i386/linux/linux_machdep.c | 25 ------------------------- 4 files changed, 28 insertions(+), 82 deletions(-) diff --git a/sys/amd64/linux/linux_machdep.c b/sys/amd64/linux/linux_machdep.c index 18be62dab9ae..1c042424f3ea 100644 --- a/sys/amd64/linux/linux_machdep.c +++ b/sys/amd64/linux/linux_machdep.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include <sys/fcntl.h> #include <sys/file.h> #include <sys/filedesc.h> -#include <sys/imgact.h> #include <sys/kernel.h> #include <sys/ktr.h> #include <sys/limits.h> @@ -83,8 +82,6 @@ __FBSDID("$FreeBSD$"); #include <x86/reg.h> #include <x86/sysarch.h> -#include <security/audit/audit.h> - #include <amd64/linux/linux.h> #include <amd64/linux/linux_proto.h> #include <compat/linux/linux_emul.h> @@ -98,30 +95,6 @@ __FBSDID("$FreeBSD$"); #define LINUX_ARCH_AMD64 0xc000003e -int -linux_execve(struct thread *td, struct linux_execve_args *args) -{ - struct image_args eargs; - char *path; - int error; - - LINUX_CTR(execve); - - if (!LUSECONVPATH(td)) { - error = exec_copyin_args(&eargs, args->path, UIO_USERSPACE, - args->argp, args->envp); - } else { - LCONVPATHEXIST(args->path, &path); - error = exec_copyin_args(&eargs, path, UIO_SYSSPACE, args->argp, - args->envp); - LFREEPATH(path); - } - if (error == 0) - error = linux_common_execve(td, &eargs); - AUDIT_SYSCALL_EXIT(error == EJUSTRETURN ? 0 : error, td); - return (error); -} - int linux_set_upcall(struct thread *td, register_t stack) { diff --git a/sys/arm64/linux/linux_machdep.c b/sys/arm64/linux/linux_machdep.c index 749e097730f7..0bfe51f7da1e 100644 --- a/sys/arm64/linux/linux_machdep.c +++ b/sys/arm64/linux/linux_machdep.c @@ -33,19 +33,15 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/fcntl.h> -#include <sys/imgact.h> #include <sys/ktr.h> #include <sys/proc.h> #include <sys/ptrace.h> #include <sys/reg.h> #include <sys/sdt.h> -#include <security/audit/audit.h> - #include <arm64/linux/linux.h> #include <arm64/linux/linux_proto.h> #include <compat/linux/linux_dtrace.h> -#include <compat/linux/linux_emul.h> #include <compat/linux/linux_fork.h> #include <compat/linux/linux_misc.h> #include <compat/linux/linux_mmap.h> @@ -59,32 +55,6 @@ LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); /* DTrace probes */ LIN_SDT_PROBE_DEFINE0(machdep, linux_mmap2, todo); -/* - * LINUXTODO: deduplicate; linux_execve is common across archs, except that on - * amd64 compat linuxulator it calls freebsd32_exec_copyin_args. - */ -int -linux_execve(struct thread *td, struct linux_execve_args *uap) -{ - struct image_args eargs; - char *path; - int error; - - if (!LUSECONVPATH(td)) { - error = exec_copyin_args(&eargs, uap->path, UIO_USERSPACE, - uap->argp, uap->envp); - } else { - LCONVPATHEXIST(uap->path, &path); - error = exec_copyin_args(&eargs, path, UIO_SYSSPACE, - uap->argp, uap->envp); - LFREEPATH(path); - } - if (error == 0) - error = linux_common_execve(td, &eargs); - AUDIT_SYSCALL_EXIT(error == EJUSTRETURN ? 0 : error, td); - return (error); -} - int linux_set_upcall(struct thread *td, register_t stack) { diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 7ea4b8481220..225187826677 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include <sys/imgact_aout.h> #endif #include <sys/jail.h> +#include <sys/imgact.h> #include <sys/kernel.h> #include <sys/limits.h> #include <sys/lock.h> @@ -74,6 +75,7 @@ __FBSDID("$FreeBSD$"); #include <sys/cpuset.h> #include <sys/uio.h> +#include <security/audit/audit.h> #include <security/mac/mac_framework.h> #include <vm/vm.h> @@ -2906,3 +2908,29 @@ linux_seccomp(struct thread *td, struct linux_seccomp_args *args) return (EINVAL); } } + +#ifndef COMPAT_LINUX32 +int +linux_execve(struct thread *td, struct linux_execve_args *args) +{ + struct image_args eargs; + char *path; + int error; + + LINUX_CTR(execve); + + if (!LUSECONVPATH(td)) { + error = exec_copyin_args(&eargs, args->path, UIO_USERSPACE, + args->argp, args->envp); + } else { + LCONVPATHEXIST(args->path, &path); + error = exec_copyin_args(&eargs, path, UIO_SYSSPACE, args->argp, + args->envp); + LFREEPATH(path); + } + if (error == 0) + error = linux_common_execve(td, &eargs); + AUDIT_SYSCALL_EXIT(error == EJUSTRETURN ? 0 : error, td); + return (error); +} +#endif diff --git a/sys/i386/linux/linux_machdep.c b/sys/i386/linux/linux_machdep.c index 1e665eb9f505..dc156dbd673d 100644 --- a/sys/i386/linux/linux_machdep.c +++ b/sys/i386/linux/linux_machdep.c @@ -33,7 +33,6 @@ __FBSDID("$FreeBSD$"); #include <sys/capsicum.h> #include <sys/fcntl.h> #include <sys/file.h> -#include <sys/imgact.h> #include <sys/lock.h> #include <sys/malloc.h> #include <sys/mman.h> @@ -61,8 +60,6 @@ __FBSDID("$FreeBSD$"); #include <vm/vm.h> #include <vm/vm_map.h> -#include <security/audit/audit.h> - #include <i386/linux/linux.h> #include <i386/linux/linux_proto.h> #include <compat/linux/linux_emul.h> @@ -97,28 +94,6 @@ struct l_old_select_argv { struct l_timeval *timeout; }; -int -linux_execve(struct thread *td, struct linux_execve_args *args) -{ - struct image_args eargs; - char *newpath; - int error; - - if (!LUSECONVPATH(td)) { - error = exec_copyin_args(&eargs, args->path, UIO_USERSPACE, - args->argp, args->envp); - } else { - LCONVPATHEXIST(args->path, &newpath); - error = exec_copyin_args(&eargs, newpath, UIO_SYSSPACE, - args->argp, args->envp); - LFREEPATH(newpath); - } - if (error == 0) - error = linux_common_execve(td, &eargs); - AUDIT_SYSCALL_EXIT(error == EJUSTRETURN ? 0 : error, td); - return (error); -} - struct l_ipc_kludge { struct l_msgbuf *msgp; l_long msgtyp;