forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Richard Henderson <[email protected]> Cc: Ivan Kokshaysky <[email protected]> Cc: Russell King <[email protected]> Cc: Ian Molton <[email protected]> Cc: Mikael Starvik <[email protected]> Cc: David Howells <[email protected]> Cc: Yoshinori Sato <[email protected]> Cc: Hirokazu Takata <[email protected]> Cc: Ralf Baechle <[email protected]> Cc: Kyle McMartin <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Paul Mundt <[email protected]> Cc: Kazumoto Kojima <[email protected]> Cc: Richard Curnow <[email protected]> Cc: William Lee Irwin III <[email protected]> Cc: "David S. Miller" <[email protected]> Cc: Jeff Dike <[email protected]> Cc: Paolo 'Blaisorblade' Giarrusso <[email protected]> Cc: Miles Bader <[email protected]> Cc: Chris Zankel <[email protected]> Cc: "Luck, Tony" <[email protected]> Cc: Geert Uytterhoeven <[email protected]> Cc: Roman Zippel <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
6 changed files
with
31 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,8 +4,6 @@ | |
* Copyright (C) 1999 David S. Miller ([email protected]) | ||
*/ | ||
|
||
#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 @@ static int powerd(void *__unused) | |
|
||
/* 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; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,8 +9,6 @@ | |
* Simplified starting of init: Michael A. Griffith <[email protected]> | ||
*/ | ||
|
||
#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) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,8 +18,6 @@ | |
call_usermodehelper wait flag, and remove exec_usermodehelper. | ||
Rusty Russell <[email protected]> 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; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |