X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Frun_shell.c;h=6be09088d76d5308fbbc337b81b672e57d4db25b;hb=966ec7c067d7a2df5232a69c8d3d2e777347a62d;hp=4855d763ecf6bb8e0a0800639983d77089081434;hpb=9e48045e45df7e3e205575a4eb3dc39d634b05aa;p=oweals%2Fbusybox.git diff --git a/libbb/run_shell.c b/libbb/run_shell.c index 4855d763e..6be09088d 100644 --- a/libbb/run_shell.c +++ b/libbb/run_shell.c @@ -37,7 +37,27 @@ #include #include "libbb.h" #ifdef CONFIG_SELINUX -#include +#include /* for setexeccon */ +#endif + +#ifdef CONFIG_SELINUX +static security_context_t current_sid; + +void +renew_current_security_context(void) +{ + if (current_sid) + freecon(current_sid); /* Release old context */ + getcon(¤t_sid); /* update */ +} +void +set_current_security_context(security_context_t sid) +{ + if (current_sid) + freecon(current_sid); /* Release old context */ + current_sid = sid; +} + #endif /* Run SHELL, or DEFAULT_SHELL if SHELL is empty. @@ -45,43 +65,37 @@ If ADDITIONAL_ARGS is nonzero, pass it to the shell as more arguments. */ -void run_shell ( const char *shell, int loginshell, const char *command, const char **additional_args -#ifdef CONFIG_SELINUX - , security_id_t sid -#endif -) +void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) { const char **args; int argno = 1; int additional_args_cnt = 0; - - for ( args = additional_args; args && *args; args++ ) + + for (args = additional_args; args && *args; args++) additional_args_cnt++; - args = (const char **) xmalloc (sizeof (char *) * ( 4 + additional_args_cnt )); - - args [0] = bb_get_last_path_component ( bb_xstrdup ( shell )); - - if ( loginshell ) { - char *args0; - bb_xasprintf ( &args0, "-%s", args [0] ); - args [0] = args0; - } - - if ( command ) { - args [argno++] = "-c"; - args [argno++] = command; + args = xmalloc(sizeof(char*) * (4 + additional_args_cnt)); + + args[0] = bb_get_last_path_component(xstrdup(shell)); + + if (loginshell) + args[0] = xasprintf("-%s", args[0]); + + if (command) { + args[argno++] = "-c"; + args[argno++] = command; } - if ( additional_args ) { - for ( ; *additional_args; ++additional_args ) - args [argno++] = *additional_args; + if (additional_args) { + for (; *additional_args; ++additional_args) + args[argno++] = *additional_args; } - args [argno] = 0; + args[argno] = NULL; #ifdef CONFIG_SELINUX - if(sid) - execve_secure(shell, (char **) args, environ, sid); - else + if (current_sid && !setexeccon(current_sid)) { + freecon(current_sid); + execve(shell, (char **) args, environ); + } else #endif - execv ( shell, (char **) args ); - bb_perror_msg_and_die ( "cannot run %s", shell ); + execv(shell, (char **) args); + bb_perror_msg_and_die("cannot run %s", shell); }