From: Arnd Bergmann <arnd@arndb.de>
To: linux-kernel@vger.kernel.org
Cc: linux-arch@vger.kernel.org, Jeff Dike <jdike@addtoit.com>,
Bjoern Steinbrink <B.Steinbrink@gmx.de>,
Arjan van de Ven <arjan@infradead.org>,
Chase Venters <chase.venters@clientec.com>,
Andrew Morton <akpm@osdl.org>,
Russell King <rmk+lkml@arm.linux.org.uk>,
rusty@rustcorp.com.au
Subject: [PATCH 1/7] introduce kernel_execve
Date: Mon, 28 Aug 2006 00:01:00 +0200 [thread overview]
Message-ID: <200608280001.01653.arnd@arndb.de> (raw)
In-Reply-To: 20060827214734.252316000@klappe.arndb.de
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 <arnd@arndb.de>
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 <linux/unistd.h>
#include <linux/kernel.h>
#include <linux/fs.h>
@@ -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 <rusty@rustcorp.com.au> Jan 2003
*/
-#define __KERNEL_SYSCALLS__
-
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/syscalls.h>
@@ -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 <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
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 <grif@acm.org>
*/
-#define __KERNEL_SYSCALLS__
-
#include <linux/types.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
@@ -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 <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 @@
/* 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;
--
next prev parent reply other threads:[~2006-08-27 23:59 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-27 21:47 [PATCH 0/7] kill __KERNEL_SYSCALLS__ Arnd Bergmann
2006-08-27 21:47 ` [PATCH 2/7] rename the provided execve functions to kernel_execve Arnd Bergmann
2006-08-28 2:20 ` Randy.Dunlap
2006-08-28 7:44 ` Arnd Bergmann
2006-08-27 21:47 ` [PATCH 3/7] provide kernel_execve on all architectures Arnd Bergmann
2006-08-29 2:22 ` Ralf Baechle
2006-08-29 17:21 ` David Howells
2006-08-27 21:47 ` [PATCH 4/7] Remove the use of _syscallX macros in UML Arnd Bergmann
2006-08-28 9:25 ` Andreas Schwab
2006-08-30 5:41 ` H. Peter Anvin
2006-08-30 12:38 ` Arnd Bergmann
2006-08-27 21:47 ` [PATCH 6/7] remove all remaining _syscallX macros Arnd Bergmann
2006-08-28 7:35 ` Andi Kleen
2006-08-28 7:41 ` Arnd Bergmann
2006-08-28 7:46 ` Arjan van de Ven
2006-08-28 8:09 ` Arnd Bergmann
2006-08-28 7:50 ` Andi Kleen
2006-08-28 8:01 ` Arnd Bergmann
2006-08-28 8:03 ` Andi Kleen
2006-08-28 8:09 ` David Miller
2006-08-28 8:15 ` Andi Kleen
2006-08-28 8:19 ` David Miller
2006-08-28 8:28 ` Andi Kleen
2006-08-28 8:40 ` David Woodhouse
2006-08-28 8:53 ` Andi Kleen
2006-08-28 10:00 ` David Woodhouse
2006-08-28 10:37 ` Arjan van de Ven
2006-08-28 10:58 ` Andi Kleen
2006-08-28 14:05 ` Arnd Bergmann
2006-08-28 14:42 ` Andi Kleen
2006-08-28 15:46 ` Adrian Bunk
2006-08-28 17:00 ` Andi Kleen
2006-08-30 17:45 ` Adrian Bunk
2006-08-28 20:20 ` Horst H. von Brand
2006-08-28 21:23 ` Arnd Bergmann
2006-08-30 5:44 ` H. Peter Anvin
2006-08-30 7:22 ` Andi Kleen
2006-08-27 21:47 ` [PATCH 7/7] remove the global errno from the kernel Arnd Bergmann
2006-08-29 17:23 ` David Howells
2006-08-27 22:00 ` [PATCH 5/7] sh64: remove the use of kernel syscalls Arnd Bergmann
2006-08-28 8:05 ` Paul Mundt
2006-08-27 22:01 ` Arnd Bergmann [this message]
2006-08-29 9:12 ` [PATCH 0/7] kill __KERNEL_SYSCALLS__ David Howells
2006-08-29 9:37 ` Arnd Bergmann
2006-08-29 9:38 ` Haavard Skinnemoen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200608280001.01653.arnd@arndb.de \
--to=arnd@arndb.de \
--cc=B.Steinbrink@gmx.de \
--cc=akpm@osdl.org \
--cc=arjan@infradead.org \
--cc=chase.venters@clientec.com \
--cc=jdike@addtoit.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rmk+lkml@arm.linux.org.uk \
--cc=rusty@rustcorp.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.