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:
parent
e0aef0d62d
commit
26700ac0c4
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user