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
This commit is contained in:
Dmitry Chagin 2022-05-23 13:18:41 +03:00
parent e0aef0d62d
commit 26700ac0c4
4 changed files with 28 additions and 82 deletions

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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

View File

@ -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;