The use of execve() in the kernel is dubious, since it relies on the __KERNEL_SYSCALLS__ mechanism that stores the result in a global errno variable. As a first step of getting rid of this, change all users to a global kernel_execve function that returns a proper error code. This function is a terrible hack, and a later patch removes it again after the kernel syscalls are gone. Signed-off-by: Arnd Bergmann Index: linux-cg/init/do_mounts_initrd.c =================================================================== --- linux-cg.orig/init/do_mounts_initrd.c 2006-08-27 23:17:58.000000000 +0200 +++ linux-cg/init/do_mounts_initrd.c 2006-08-27 23:18:58.000000000 +0200 @@ -1,4 +1,3 @@ -#define __KERNEL_SYSCALLS__ #include #include #include @@ -35,7 +34,7 @@ (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) Index: linux-cg/kernel/kmod.c =================================================================== --- linux-cg.orig/kernel/kmod.c 2006-08-27 23:17:58.000000000 +0200 +++ linux-cg/kernel/kmod.c 2006-08-27 23:18:58.000000000 +0200 @@ -18,8 +18,6 @@ call_usermodehelper wait flag, and remove exec_usermodehelper. Rusty Russell Jan 2003 */ -#define __KERNEL_SYSCALLS__ - #include #include #include @@ -150,7 +148,8 @@ 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; Index: linux-cg/lib/Makefile =================================================================== --- linux-cg.orig/lib/Makefile 2006-08-27 23:17:58.000000000 +0200 +++ linux-cg/lib/Makefile 2006-08-27 23:18:58.000000000 +0200 @@ -33,6 +33,8 @@ 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 Index: linux-cg/lib/execve.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-cg/lib/execve.c 2006-08-27 23:18:58.000000000 +0200 @@ -0,0 +1,23 @@ +#include +#include + +#define __KERNEL_SYSCALLS__ +static int errno __attribute__((unused)); +#include + +#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 Index: linux-cg/init/main.c =================================================================== --- linux-cg.orig/init/main.c 2006-08-27 23:17:58.000000000 +0200 +++ linux-cg/init/main.c 2006-08-27 23:18:58.000000000 +0200 @@ -9,8 +9,6 @@ * Simplified starting of init: Michael A. Griffith */ -#define __KERNEL_SYSCALLS__ - #include #include #include @@ -679,7 +677,7 @@ 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) Index: linux-cg/arch/sparc64/kernel/power.c =================================================================== --- linux-cg.orig/arch/sparc64/kernel/power.c 2006-08-27 23:18:53.000000000 +0200 +++ linux-cg/arch/sparc64/kernel/power.c 2006-08-27 23:19:04.000000000 +0200 @@ -4,8 +4,6 @@ * Copyright (C) 1999 David S. Miller (davem@redhat.com) */ -#define __KERNEL_SYSCALLS__ - #include #include #include @@ -14,6 +12,7 @@ #include #include #include +#include #include #include @@ -98,7 +97,7 @@ /* 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; -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/