mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-19 02:54:00 +08:00
generic sys_execve()
Selected by __ARCH_WANT_SYS_EXECVE in unistd.h. Requires * working current_pt_regs() * *NOT* doing a syscall-in-kernel kind of kernel_execve() implementation. Using generic kernel_execve() is fine. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
282124d186
commit
38b983b346
38
fs/exec.c
38
fs/exec.c
@ -401,7 +401,7 @@ struct user_arg_ptr {
|
|||||||
union {
|
union {
|
||||||
const char __user *const __user *native;
|
const char __user *const __user *native;
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
compat_uptr_t __user *compat;
|
const compat_uptr_t __user *compat;
|
||||||
#endif
|
#endif
|
||||||
} ptr;
|
} ptr;
|
||||||
};
|
};
|
||||||
@ -1600,9 +1600,9 @@ int do_execve(const char *filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
int compat_do_execve(char *filename,
|
int compat_do_execve(const char *filename,
|
||||||
compat_uptr_t __user *__argv,
|
const compat_uptr_t __user *__argv,
|
||||||
compat_uptr_t __user *__envp,
|
const compat_uptr_t __user *__envp,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct user_arg_ptr argv = {
|
struct user_arg_ptr argv = {
|
||||||
@ -2319,6 +2319,36 @@ int dump_seek(struct file *file, loff_t off)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dump_seek);
|
EXPORT_SYMBOL(dump_seek);
|
||||||
|
|
||||||
|
#ifdef __ARCH_WANT_SYS_EXECVE
|
||||||
|
SYSCALL_DEFINE3(execve,
|
||||||
|
const char __user *, filename,
|
||||||
|
const char __user *const __user *, argv,
|
||||||
|
const char __user *const __user *, envp)
|
||||||
|
{
|
||||||
|
const char *path = getname(filename);
|
||||||
|
int error = PTR_ERR(path);
|
||||||
|
if (!IS_ERR(path)) {
|
||||||
|
error = do_execve(path, argv, envp, current_pt_regs());
|
||||||
|
putname(path);
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
asmlinkage long compat_sys_execve(const char __user * filename,
|
||||||
|
const compat_uptr_t __user * argv,
|
||||||
|
const compat_uptr_t __user * envp)
|
||||||
|
{
|
||||||
|
const char *path = getname(filename);
|
||||||
|
int error = PTR_ERR(path);
|
||||||
|
if (!IS_ERR(path)) {
|
||||||
|
error = compat_do_execve(path, argv, envp, current_pt_regs());
|
||||||
|
putname(path);
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __ARCH_WANT_KERNEL_EXECVE
|
#ifdef __ARCH_WANT_KERNEL_EXECVE
|
||||||
int kernel_execve(const char *filename,
|
int kernel_execve(const char *filename,
|
||||||
const char *const argv[],
|
const char *const argv[],
|
||||||
|
@ -289,8 +289,12 @@ asmlinkage ssize_t compat_sys_pwritev(unsigned long fd,
|
|||||||
const struct compat_iovec __user *vec,
|
const struct compat_iovec __user *vec,
|
||||||
unsigned long vlen, u32 pos_low, u32 pos_high);
|
unsigned long vlen, u32 pos_low, u32 pos_high);
|
||||||
|
|
||||||
int compat_do_execve(char *filename, compat_uptr_t __user *argv,
|
int compat_do_execve(const char *filename, const compat_uptr_t __user *argv,
|
||||||
compat_uptr_t __user *envp, struct pt_regs *regs);
|
const compat_uptr_t __user *envp, struct pt_regs *regs);
|
||||||
|
#ifdef __ARCH_WANT_SYS_EXECVE
|
||||||
|
asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
|
||||||
|
const compat_uptr_t __user *envp);
|
||||||
|
#endif
|
||||||
|
|
||||||
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
|
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
|
||||||
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
||||||
|
Loading…
Reference in New Issue
Block a user