Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6783eaa2 authored by Al Viro's avatar Al Viro
Browse files

x86, um/x86: switch to generic sys_execve and kernel_execve



32bit wrapper is lost on that; 64bit one is *not*, since
we need to arrange for full pt_regs on stack when we call
sys_execve() and we need to load callee-saved ones from
there afterwards.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7076aada
Loading
Loading
Loading
Loading
+2 −23
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@
#include "mem_user.h"
#include "mem_user.h"
#include "skas.h"
#include "skas.h"
#include "os.h"
#include "os.h"
#include "internal.h"


void flush_thread(void)
void flush_thread(void)
{
{
@@ -49,27 +48,7 @@ void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
}
}
EXPORT_SYMBOL(start_thread);
EXPORT_SYMBOL(start_thread);


long um_execve(const char *file, const char __user *const __user *argv, const char __user *const __user *env)
void __noreturn ret_from_kernel_execve(struct pt_regs *unused)
{
{
	long err;

	err = do_execve(file, argv, env, &current->thread.regs);
	if (!err)
	UML_LONGJMP(current->thread.exec_buf, 1);
	UML_LONGJMP(current->thread.exec_buf, 1);
	return err;
}

long sys_execve(const char __user *file, const char __user *const __user *argv,
		const char __user *const __user *env)
{
	long error;
	char *filename;

	filename = getname(file);
	error = PTR_ERR(filename);
	if (IS_ERR(filename)) goto out;
	error = do_execve(filename, argv, env, &current->thread.regs);
	putname(filename);
 out:
	return error;
}
}

arch/um/kernel/internal.h

deleted100644 → 0
+0 −1
Original line number Original line Diff line number Diff line
extern long um_execve(const char *file, const char __user *const __user *argv, const char __user *const __user *env);
+0 −17
Original line number Original line Diff line number Diff line
@@ -13,7 +13,6 @@
#include "asm/mman.h"
#include "asm/mman.h"
#include "asm/uaccess.h"
#include "asm/uaccess.h"
#include "asm/unistd.h"
#include "asm/unistd.h"
#include "internal.h"


long sys_fork(void)
long sys_fork(void)
{
{
@@ -50,19 +49,3 @@ long old_mmap(unsigned long addr, unsigned long len,
 out:
 out:
	return err;
	return err;
}
}

int kernel_execve(const char *filename,
		  const char *const argv[],
		  const char *const envp[])
{
	mm_segment_t fs;
	int ret;

	fs = get_fs();
	set_fs(KERNEL_DS);
	ret = um_execve(filename, (const char __user *const __user *)argv,
			(const char __user *const __user *) envp);
	set_fs(fs);

	return ret;
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -459,7 +459,7 @@ GLOBAL(\label)
	PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
	PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
	PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
	PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
	PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx
	PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx
	PTREGSCALL stub32_execve, sys32_execve, %rcx
	PTREGSCALL stub32_execve, compat_sys_execve, %rcx
	PTREGSCALL stub32_fork, sys_fork, %rdi
	PTREGSCALL stub32_fork, sys_fork, %rdi
	PTREGSCALL stub32_clone, sys32_clone, %rdx
	PTREGSCALL stub32_clone, sys32_clone, %rdx
	PTREGSCALL stub32_vfork, sys_vfork, %rdi
	PTREGSCALL stub32_vfork, sys_vfork, %rdi
+0 −15
Original line number Original line Diff line number Diff line
@@ -385,21 +385,6 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd,
	return ret;
	return ret;
}
}


asmlinkage long sys32_execve(const char __user *name, compat_uptr_t __user *argv,
			     compat_uptr_t __user *envp, struct pt_regs *regs)
{
	long error;
	char *filename;

	filename = getname(name);
	error = PTR_ERR(filename);
	if (IS_ERR(filename))
		return error;
	error = compat_do_execve(filename, argv, envp, regs);
	putname(filename);
	return error;
}

asmlinkage long sys32_clone(unsigned int clone_flags, unsigned int newsp,
asmlinkage long sys32_clone(unsigned int clone_flags, unsigned int newsp,
			    struct pt_regs *regs)
			    struct pt_regs *regs)
{
{
Loading