Deprecated exec_usermodehelper, enhance call_usermodehelper
Subsystems (10)
Quoted 1 line
In message <[email protected]> you w
ri
Quoted 11 lines
te:
Quoted 7 lines · Rusty Russell
Quoted 2 lines
Linus, please apply.
Nope, I really don't want to deprecate any more interfaces while my build is still so noisy about the _existing_ deprecated stuff.
OK. I'll work with the various authors to actually remove all 3 users in the tree, then submit a patch to rip it out.
OK. This patch does that. Thomas, Marcel, James? This touches code I don't use, so although the transformation is fairly trivial...
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
Name: exec_usermodehelper sucks
Author: Rusty Russell
Status: Tested on 2.5.54
D: Urban Widmark points out that modprobe calls system() in many
D: configurations, which drops privs since request_module() doesn't
D: doesn't set ruid and rguid.
D:
D: This gets rid of exec_usermodehelper and makes everyone use
D: call_usermodehelper, which has a new "wait" flag.
include/linux/kmod.h +2 -2
@@ -21,6 +21,7 @@#include <linux/config.h> #include <linux/errno.h> +#include <linux/compiler.h> #ifdef CONFIG_KMOD extern int request_module (const char * name);
@@ -29,8 +30,7 @@ static inline int request_module(const c#endif #define try_then_request_module (x, mod) ((x) ?: request_module(mod), (x)) -extern int exec_usermodehelper (char *program_path,char *argv[],char *envp[]); -extern int call_usermodehelper (char *path,char *argv[],char *envp[]); +extern int call_usermodehelper (char *path,char *argv[],char *envp[],int wait);#ifdef CONFIG_HOTPLUG extern char hotplug_path [];
kernel/kmod.c +78 -205
383 lines not on this page · raw message
arch/i386/mach-voyager/voyager_thread.c +4 -13
@@ -57,7 +57,7 @@ voyager_thread_start(void) }static int -execute_helper (void *string) +execute (const char *string) {int ret;
@@ -74,23 +74,14 @@ execute_helper(void *string) NULL, }; -if ((ret =exec_usermodehelper (argv[0 ], argv, envp)) <0 ) { -printk (KERN_ERR "Voyager failed to execute \"%s\"\n" , - (char *)string); +if ((ret =call_usermodehelper (argv[0 ], argv, envp,1 )) !=0 ) { +printk (KERN_ERR "Voyager failed to run \"%s\": %i\n" , + string, ret); }return ret; }static void -execute (char *string) -{ -if (kernel_thread (execute_helper, (void *)string,CLONE_VFORK |SIGCHLD ) <0 ) { -printk (KERN_ERR "Voyager failed to fork before exec of \"%s\"\n" , - string); - } -} - -static void check_from_kernel (void ) {if (voyager_status.switch_off) {
drivers/acpi/thermal.c +1 -1
@@ -431,7 +431,7 @@ acpi_thermal_call_usermode ( envp[0 ] ="HOME=/" ; envp[1 ] ="PATH=/sbin:/bin:/usr/sbin:/usr/bin" ; -call_usermodehelper (argv[0 ], argv, envp); +call_usermodehelper (argv[0 ], argv, envp,0 );return_VALUE (0 ); }
drivers/base/hotplug.c +1 -1
@@ -114,7 +114,7 @@ static int do_hotplug (struct device *depr_debug ("%s: %s %s %s %s %s %s\n" , __FUNCTION__, argv [0 ], argv[1 ], envp[0 ], envp[1 ], envp[2 ], envp[3 ]); - retval =call_usermodehelper (argv [0 ], argv, envp); + retval =call_usermodehelper (argv [0 ], argv, envp,0 );if (retval)pr_debug ("%s - call_usermodehelper returned %d\n" , __FUNCTION__, retval);
drivers/bluetooth/bt3c_cs.c +8 -51
73 lines not on this page · raw message
drivers/ieee1394/nodemgr.c +1 -1
@@ -786,7 +786,7 @@ static void nodemgr_call_policy(char *ve#ifdef CONFIG_IEEE1394_VERBOSEDEBUG HPSB_DEBUG ("NodeMgr: %s %s %016Lx" , argv[0 ], verb, (long long unsigned )ud->ne->guid);#endif - value =call_usermodehelper (argv[0 ], argv, envp); + value =call_usermodehelper (argv[0 ], argv, envp,0 );kfree (buf);kfree (envp);if (value !=0 )
drivers/input/input.c +1 -1
@@ -383,7 +383,7 @@ static void input_call_hotplug(char *ver argv[0], argv[1], envp[0], envp[1], envp[2], envp[3], envp[4]);#endif - value =call_usermodehelper (argv [0 ], argv, envp); + value =call_usermodehelper (argv [0 ], argv, envp,0 );kfree (buf);kfree (envp);
drivers/isdn/hardware/eicon/divasmain.c +1 -1
@@ -263,7 +263,7 @@ static void diva_adapter_trapped(void *c pdpc->card_failed =0 ; argv[2 ] = &adapter[0 ]; - ret =call_usermodehelper (argv[0 ], argv, envp); + ret =call_usermodehelper (argv[0 ], argv, envp,0 );if (ret) { printk(KERN_ERR
drivers/net/hamradio/baycom_epp.c +6 -39
60 lines not on this page · raw message
drivers/pnp/pnpbios/core.c +1 -1
@@ -602,7 +602,7 @@ static int pnp_dock_event(int dock, stru info->location_id, info->serial, info->capabilities); envp[i] =0 ; - value =call_usermodehelper (argv [0 ], argv, envp); + value =call_usermodehelper (argv [0 ], argv, envp,0 );kfree (buf);kfree (envp);return 0 ;
net/bluetooth/hci_core.c +1 -1
@@ -114,7 +114,7 @@ static int hci_run_hotplug(char *dev, ch envp[3 ] = astr; envp[4 ] =NULL ; -return call_usermodehelper (argv[0 ], argv, envp); +return call_usermodehelper (argv[0 ], argv, envp,0 ); }#else #define hci_run_hotplug(A...)
net/core/dev.c +1 -1
@@ -2918,6 +2918,6 @@ static int net_run_sbin_hotplug(struct n envp [i++] = action_str; envp [i] =0 ; - return call_usermodehelper(argv [0], argv, envp); + return call_usermodehelper(argv [0], argv, envp, 0); }#endif
Quoted 2 lines · Rusty Russell
OK. This patch does that. Thomas, Marcel, James? This touches code I don't use, so although the transformation is fairly trivial...
Looks ok for me. Not tested yet, should there be any problem, I'll fix up later. I vote for inclusion.
Tom
Marcel Holtmann
maintainerHi Rusty,
Quoted 2 lines
OK. This patch does that. Thomas, Marcel, James? This touches code I don't use, so although the transformation is fairly trivial...
it looks ok to me, but I like to have the attached patch for the bt3c_cs driver. My test yesterday was successful and so I vote for inclusion, like Thomas does.
Regards
Marcel
drivers/bluetooth/bt3c_cs.c +7 -54
@@ -24,18 +24,14 @@#include <linux/config.h> #include <linux/module.h> -#define __KERNEL_SYSCALLS__ -#include <linux/kernel.h> #include <linux/kmod.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/types.h> #include <linux/sched.h> -#include <linux/delay.h> #include <linux/timer.h> #include <linux/errno.h> -#include <linux/unistd.h> #include <linux/ptrace.h> #include <linux/ioport.h> #include <linux/spinlock.h>
@@ -405,7 +401,6 @@ -/* ======================== HCI interface ======================== */
@@ -489,65 +484,23 @@#define FW_LOADER "/sbin/bluefw" -static int errno; - - -static int bt3c_fw_loader_exec (void *dev) -{ -char *argv[] = {FW_LOADER ,"pccard" , dev,NULL }; -char *envp[] = {"HOME=/" ,"TERM=linux" ,"PATH=/sbin:/usr/sbin:/bin:/usr/bin" ,NULL }; -int err; - - err =exec_usermodehelper (FW_LOADER , argv, envp); -if (err) -printk (KERN_WARNING "bt3c_cs: Failed to exec \"%s pccard %s\".\n" ,FW_LOADER , (char *)dev); - -return err; -}static int bt3c_firmware_load (bt3c_info_t *info) { -sigset_t tmpsig;char dev[16 ]; -pid_t pid; -int result; +int err; -/* Check if root fs is mounted */ -if (!current->fs->root) { -printk (KERN_WARNING "bt3c_cs: Root filesystem is not mounted.\n" ); -return -EPERM ; - } +char *argv[] = {FW_LOADER ,"pccard" , dev,NULL }; +char *envp[] = {"HOME=/" ,"TERM=linux" ,"PATH=/sbin:/usr/sbin:/bin:/usr/bin" ,NULL };sprintf (dev,"%04x" , info->link.io.BasePort1); - pid =kernel_thread (bt3c_fw_loader_exec, (void *)dev,0 ); -if (pid <0 ) { -printk (KERN_WARNING "bt3c_cs: Forking of kernel thread failed (errno=%d).\n" , -pid); -return pid; - } - -/* Block signals, everything but SIGKILL/SIGSTOP */ -spin_lock_irq (¤t->sig->siglock); - tmpsig = current->blocked; -siginitsetinv (¤t->blocked,sigmask (SIGKILL ) |sigmask (SIGSTOP )); -recalc_sigpending (); -spin_unlock_irq (¤t->sig->siglock); - - result =waitpid (pid,NULL , __WCLONE); - -/* Allow signals again */ -spin_lock_irq (¤t->sig->siglock); - current->blocked = tmpsig; -recalc_sigpending (); -spin_unlock_irq (¤t->sig->siglock); - -if (result != pid) { -printk (KERN_WARNING "bt3c_cs: Waiting for pid %d failed (errno=%d).\n" , pid, -result); -return -result; - } + err =call_usermodehelper (FW_LOADER , argv, envp,1 ); +if (err) +printk (KERN_WARNING "bt3c_cs: Failed to run \"%s pccard %s\" (errno=%d).\n" ,FW_LOADER , dev, err); -return 0 ; +return err; }
In message <[email protected]> you write:
Quoted 5 lines
--=-RFd7TJ35Vc8g4FmlT/lM
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Quoted 8 lines
Hi Rusty,
Quoted 2 lines
OK. This patch does that. Thomas, Marcel, James? This touches code I don't use, so although the transformation is fairly trivial...
it looks ok to me, but I like to have the attached patch for the
bt3c_csdriver. My test yesterday was successful and so I vote for inclusion, like Thomas does.
Done. Linus, please apply.
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
Name: exec_usermodehelper sucks
Author: Rusty Russell, Marcel Holtmann
Status: Tested on 2.5.54
D: Urban Widmark points out that modprobe calls system() in many
D: configurations, which drops privs since request_module() doesn't
D: doesn't set ruid and rguid.
D:
D: This gets rid of exec_usermodehelper and makes everyone use
D: call_usermodehelper, which has a new "wait" flag.
include/linux/kmod.h +2 -2
@@ -21,6 +21,7 @@#include <linux/config.h> #include <linux/errno.h> +#include <linux/compiler.h> #ifdef CONFIG_KMOD extern int request_module (const char * name);
@@ -29,8 +30,7 @@ static inline int request_module(const c#endif #define try_then_request_module (x, mod) ((x) ?: request_module(mod), (x)) -extern int exec_usermodehelper (char *program_path,char *argv[],char *envp[]); -extern int call_usermodehelper (char *path,char *argv[],char *envp[]); +extern int call_usermodehelper (char *path,char *argv[],char *envp[],int wait);#ifdef CONFIG_HOTPLUG extern char hotplug_path [];
kernel/kmod.c +78 -205
383 lines not on this page · raw message
arch/i386/mach-voyager/voyager_thread.c +4 -13
@@ -57,7 +57,7 @@ voyager_thread_start(void) }static int -execute_helper (void *string) +execute (const char *string) {int ret;
@@ -74,23 +74,14 @@ execute_helper(void *string) NULL, }; -if ((ret =exec_usermodehelper (argv[0 ], argv, envp)) <0 ) { -printk (KERN_ERR "Voyager failed to execute \"%s\"\n" , - (char *)string); +if ((ret =call_usermodehelper (argv[0 ], argv, envp,1 )) !=0 ) { +printk (KERN_ERR "Voyager failed to run \"%s\": %i\n" , + string, ret); }return ret; }static void -execute (char *string) -{ -if (kernel_thread (execute_helper, (void *)string,CLONE_VFORK |SIGCHLD ) <0 ) { -printk (KERN_ERR "Voyager failed to fork before exec of \"%s\"\n" , - string); - } -} - -static void check_from_kernel (void ) {if (voyager_status.switch_off) {
drivers/acpi/thermal.c +1 -1
@@ -431,7 +431,7 @@ acpi_thermal_call_usermode ( envp[0 ] ="HOME=/" ; envp[1 ] ="PATH=/sbin:/bin:/usr/sbin:/usr/bin" ; -call_usermodehelper (argv[0 ], argv, envp); +call_usermodehelper (argv[0 ], argv, envp,0 );return_VALUE (0 ); }
drivers/base/hotplug.c +1 -1
@@ -114,7 +114,7 @@ static int do_hotplug (struct device *depr_debug ("%s: %s %s %s %s %s %s\n" , __FUNCTION__, argv [0 ], argv[1 ], envp[0 ], envp[1 ], envp[2 ], envp[3 ]); - retval =call_usermodehelper (argv [0 ], argv, envp); + retval =call_usermodehelper (argv [0 ], argv, envp,0 );if (retval)pr_debug ("%s - call_usermodehelper returned %d\n" , __FUNCTION__, retval);
drivers/bluetooth/bt3c_cs.c +7 -54
97 lines not on this page · raw message
drivers/ieee1394/nodemgr.c +1 -1
@@ -786,7 +786,7 @@ static void nodemgr_call_policy(char *ve#ifdef CONFIG_IEEE1394_VERBOSEDEBUG HPSB_DEBUG ("NodeMgr: %s %s %016Lx" , argv[0 ], verb, (long long unsigned )ud->ne->guid);#endif - value =call_usermodehelper (argv[0 ], argv, envp); + value =call_usermodehelper (argv[0 ], argv, envp,0 );kfree (buf);kfree (envp);if (value !=0 )
drivers/input/input.c +1 -1
@@ -383,7 +383,7 @@ static void input_call_hotplug(char *ver argv[0], argv[1], envp[0], envp[1], envp[2], envp[3], envp[4]);#endif - value =call_usermodehelper (argv [0 ], argv, envp); + value =call_usermodehelper (argv [0 ], argv, envp,0 );kfree (buf);kfree (envp);
drivers/isdn/hardware/eicon/divasmain.c +1 -1
@@ -263,7 +263,7 @@ static void diva_adapter_trapped(void *c pdpc->card_failed =0 ; argv[2 ] = &adapter[0 ]; - ret =call_usermodehelper (argv[0 ], argv, envp); + ret =call_usermodehelper (argv[0 ], argv, envp,0 );if (ret) { printk(KERN_ERR
drivers/net/hamradio/baycom_epp.c +6 -39
60 lines not on this page · raw message
drivers/pnp/pnpbios/core.c +1 -1
@@ -602,7 +602,7 @@ static int pnp_dock_event(int dock, stru info->location_id, info->serial, info->capabilities); envp[i] =0 ; - value =call_usermodehelper (argv [0 ], argv, envp); + value =call_usermodehelper (argv [0 ], argv, envp,0 );kfree (buf);kfree (envp);return 0 ;
net/bluetooth/hci_core.c +1 -1
@@ -114,7 +114,7 @@ static int hci_run_hotplug(char *dev, ch envp[3 ] = astr; envp[4 ] =NULL ; -return call_usermodehelper (argv[0 ], argv, envp); +return call_usermodehelper (argv[0 ], argv, envp,0 ); }#else #define hci_run_hotplug(A...)
net/core/dev.c +1 -1
@@ -2918,6 +2918,6 @@ static int net_run_sbin_hotplug(struct n envp [i++] = action_str; envp [i] =0 ; - return call_usermodehelper(argv [0], argv, envp); + return call_usermodehelper(argv [0], argv, envp, 0); }#endif