diff options
-rw-r--r-- | arch/sparc64/kernel/power.c | 5 | ||||
-rw-r--r-- | init/do_mounts_initrd.c | 3 | ||||
-rw-r--r-- | init/main.c | 4 | ||||
-rw-r--r-- | kernel/kmod.c | 5 | ||||
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/execve.c | 23 |
6 files changed, 31 insertions, 11 deletions
diff --git a/arch/sparc64/kernel/power.c b/arch/sparc64/kernel/power.c index e55466c..0b9c706 100644 --- a/arch/sparc64/kernel/power.c +++ b/arch/sparc64/kernel/power.c @@ -4,8 +4,6 @@ * Copyright (C) 1999 David S. Miller (davem@redhat.com) */ -#define __KERNEL_SYSCALLS__ - #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> @@ -14,6 +12,7 @@ #include <linux/delay.h> #include <linux/interrupt.h> #include <linux/pm.h> +#include <linux/syscalls.h> #include <asm/system.h> #include <asm/auxio.h> @@ -98,7 +97,7 @@ again: /* Ok, down we go... */ button_pressed = 0; - if (execve("/sbin/shutdown", argv, envp) < 0) { + if (kernel_execve("/sbin/shutdown", argv, envp) < 0) { printk("powerd: shutdown execution failed\n"); add_wait_queue(&powerd_wait, &wait); goto again; diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c index a06f037..919a80c 100644 --- a/init/do_mounts_initrd.c +++ b/init/do_mounts_initrd.c @@ -1,4 +1,3 @@ -#define __KERNEL_SYSCALLS__ #include <linux/unistd.h> #include <linux/kernel.h> #include <linux/fs.h> @@ -35,7 +34,7 @@ static int __init do_linuxrc(void * shell) (void) sys_open("/dev/console",O_RDWR,0); (void) sys_dup(0); (void) sys_dup(0); - return execve(shell, argv, envp_init); + return kernel_execve(shell, argv, envp_init); } static void __init handle_initrd(void) diff --git a/init/main.c b/init/main.c index 0766e69..a49b002 100644 --- a/init/main.c +++ b/init/main.c @@ -9,8 +9,6 @@ * Simplified starting of init: Michael A. Griffith <grif@acm.org> */ -#define __KERNEL_SYSCALLS__ - #include <linux/types.h> #include <linux/module.h> #include <linux/proc_fs.h> @@ -703,7 +701,7 @@ static void do_pre_smp_initcalls(void) static void run_init_process(char *init_filename) { argv_init[0] = init_filename; - execve(init_filename, argv_init, envp_init); + kernel_execve(init_filename, argv_init, envp_init); } static int init(void * unused) diff --git a/kernel/kmod.c b/kernel/kmod.c index f8121b9..bb4e29d 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -18,8 +18,6 @@ call_usermodehelper wait flag, and remove exec_usermodehelper. Rusty Russell <rusty@rustcorp.com.au> Jan 2003 */ -#define __KERNEL_SYSCALLS__ - #include <linux/module.h> #include <linux/sched.h> #include <linux/syscalls.h> @@ -169,7 +167,8 @@ static int ____call_usermodehelper(void *data) retval = -EPERM; if (current->fs->root) - retval = execve(sub_info->path, sub_info->argv, sub_info->envp); + retval = kernel_execve(sub_info->path, + sub_info->argv, sub_info->envp); /* Exec failed? */ sub_info->retval = retval; diff --git a/lib/Makefile b/lib/Makefile index ddf3e67..4d752be 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -35,6 +35,8 @@ ifneq ($(CONFIG_HAVE_DEC_LOCK),y) lib-y += dec_and_lock.o endif +lib-y += execve.o + obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o obj-$(CONFIG_CRC16) += crc16.o obj-$(CONFIG_CRC32) += crc32.o diff --git a/lib/execve.c b/lib/execve.c new file mode 100644 index 0000000..2667ebc --- /dev/null +++ b/lib/execve.c @@ -0,0 +1,23 @@ +#include <asm/bug.h> +#include <asm/uaccess.h> + +#define __KERNEL_SYSCALLS__ +static int errno __attribute__((unused)); +#include <asm/unistd.h> + +#ifdef _syscall3 +int kernel_execve (const char *filename, char *const argv[], char *const envp[]) + __attribute__((__weak__)); +int kernel_execve (const char *filename, char *const argv[], char *const envp[]) +{ + mm_segment_t fs = get_fs(); + int ret; + + WARN_ON(segment_eq(fs, USER_DS)); + ret = execve(filename, (char **)argv, (char **)envp); + if (ret) + ret = -errno; + + return ret; +} +#endif |