use user's shell instead of hardwired "/bin/sh" (android needs this)

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2011-03-08 21:00:36 +01:00
parent 86cf0364bd
commit 681efe20d3
12 changed files with 38 additions and 28 deletions

View File

@ -99,8 +99,12 @@ void FAST_FUNC data_extract_to_command(archive_handle_t *archive_handle)
close(p[1]); close(p[1]);
xdup2(p[0], STDIN_FILENO); xdup2(p[0], STDIN_FILENO);
signal(SIGPIPE, SIG_DFL); signal(SIGPIPE, SIG_DFL);
execl(DEFAULT_SHELL, DEFAULT_SHELL_SHORT_NAME, "-c", archive_handle->tar__to_command, NULL); execl(archive_handle->tar__to_command_shell,
bb_perror_msg_and_die("can't execute '%s'", DEFAULT_SHELL); archive_handle->tar__to_command_shell,
"-c",
archive_handle->tar__to_command,
NULL);
bb_perror_msg_and_die("can't execute '%s'", archive_handle->tar__to_command_shell);
} }
close(p[0]); close(p[0]);
/* Our caller is expected to do signal(SIGPIPE, SIG_IGN) /* Our caller is expected to do signal(SIGPIPE, SIG_IGN)

View File

@ -970,6 +970,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
putenv((char*)"TAR_FILETYPE=f"); putenv((char*)"TAR_FILETYPE=f");
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
tar_handle->action_data = data_extract_to_command; tar_handle->action_data = data_extract_to_command;
IF_FEATURE_TAR_TO_COMMAND(tar_handle->tar__to_command_shell = xstrdup(get_shell_name());)
} }
if (opt & OPT_KEEP_OLD) if (opt & OPT_KEEP_OLD)

View File

@ -144,9 +144,7 @@ int openvt_main(int argc UNUSED_PARAM, char **argv)
if (!argv[0]) { if (!argv[0]) {
argv--; argv--;
argv[0] = getenv("SHELL"); argv[0] = (char *) get_shell_name();
if (!argv[0])
argv[0] = (char *) DEFAULT_SHELL;
/*argv[1] = NULL; - already is */ /*argv[1] = NULL; - already is */
} }

View File

@ -23,11 +23,9 @@ int chroot_main(int argc UNUSED_PARAM, char **argv)
++argv; ++argv;
if (!*argv) { /* no 2nd param (PROG), use shell */ if (!*argv) { /* no 2nd param (PROG), use shell */
argv -= 2; argv -= 2;
argv[0] = getenv("SHELL"); argv[0] = (char *) get_shell_name();
if (!argv[0]) { argv[1] = (char *) "-i"; /* GNU coreutils 8.4 compat */
argv[0] = (char *) DEFAULT_SHELL; /*argv[2] = NULL; - already is */
}
argv[1] = (char *) "-i";
} }
BB_EXECVP_or_die(argv); BB_EXECVP_or_die(argv);

View File

@ -84,6 +84,7 @@ typedef struct archive_handle_t {
# endif # endif
#if ENABLE_FEATURE_TAR_TO_COMMAND #if ENABLE_FEATURE_TAR_TO_COMMAND
char* tar__to_command; char* tar__to_command;
const char* tar__to_command_shell;
#endif #endif
# if ENABLE_FEATURE_TAR_SELINUX # if ENABLE_FEATURE_TAR_SELINUX
char* tar__global_sctx; char* tar__global_sctx;

View File

@ -1198,10 +1198,17 @@ char *bb_simplify_path(const char *path) FAST_FUNC;
/* Returns ptr to NUL */ /* Returns ptr to NUL */
char *bb_simplify_abs_path_inplace(char *path) FAST_FUNC; char *bb_simplify_abs_path_inplace(char *path) FAST_FUNC;
#define FAIL_DELAY 3 #define LOGIN_FAIL_DELAY 3
extern void bb_do_delay(int seconds) FAST_FUNC; extern void bb_do_delay(int seconds) FAST_FUNC;
extern void change_identity(const struct passwd *pw) FAST_FUNC; extern void change_identity(const struct passwd *pw) FAST_FUNC;
extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) NORETURN FAST_FUNC; extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) NORETURN FAST_FUNC;
/* Returns $SHELL, getpwuid(getuid())->pw_shell, or DEFAULT_SHELL.
* Note that getpwuid result might need xstrdup'ing
* if there is a possibility of intervening getpwxxx() calls.
*/
const char *get_shell_name(void);
#if ENABLE_SELINUX #if ENABLE_SELINUX
extern void renew_current_security_context(void) FAST_FUNC; extern void renew_current_security_context(void) FAST_FUNC;
extern void set_current_security_context(security_context_t sid) FAST_FUNC; extern void set_current_security_context(security_context_t sid) FAST_FUNC;

View File

@ -132,7 +132,8 @@ int adduser_main(int argc UNUSED_PARAM, char **argv)
} }
pw.pw_gecos = (char *)"Linux User,,,"; pw.pw_gecos = (char *)"Linux User,,,";
pw.pw_shell = (char *)DEFAULT_SHELL; /* We assume that newly created users "inherit" root's shell setting */
pw.pw_shell = (char *)get_shell_name();
pw.pw_dir = NULL; pw.pw_dir = NULL;
/* exactly one non-option arg */ /* exactly one non-option arg */

View File

@ -316,10 +316,8 @@ static NOINLINE void start_shell_in_child(const char* tty_name)
int pid = xvfork(); int pid = xvfork();
if (pid == 0) { if (pid == 0) {
struct termios termchild; struct termios termchild;
char *shell = getenv("SHELL"); const char *shell = get_shell_name();
if (!shell)
shell = (char *) DEFAULT_SHELL;
signal(SIGHUP, SIG_IGN); signal(SIGHUP, SIG_IGN);
// set tty as a controlling tty // set tty as a controlling tty
setsid(); setsid();

View File

@ -20,8 +20,9 @@
static void edit_file(const struct passwd *pas, const char *file) static void edit_file(const struct passwd *pas, const char *file)
{ {
const char *ptr; const char *ptr;
int pid = xvfork(); pid_t pid;
pid = xvfork();
if (pid) { /* parent */ if (pid) { /* parent */
wait4pid(pid); wait4pid(pid);
return; return;
@ -30,7 +31,7 @@ static void edit_file(const struct passwd *pas, const char *file)
/* CHILD - change user and run editor */ /* CHILD - change user and run editor */
/* initgroups, setgid, setuid */ /* initgroups, setgid, setuid */
change_identity(pas); change_identity(pas);
setup_environment(DEFAULT_SHELL, setup_environment(pas->pw_shell,
SETUP_ENV_CHANGEENV | SETUP_ENV_TO_TMP, SETUP_ENV_CHANGEENV | SETUP_ENV_TO_TMP,
pas); pas);
ptr = getenv("VISUAL"); ptr = getenv("VISUAL");
@ -41,7 +42,7 @@ static void edit_file(const struct passwd *pas, const char *file)
} }
BB_EXECLP(ptr, ptr, file, NULL); BB_EXECLP(ptr, ptr, file, NULL);
bb_perror_msg_and_die("exec %s", ptr); bb_perror_msg_and_die("can't execute '%s'", ptr);
} }
static int open_as_user(const struct passwd *pas, const char *file) static int open_as_user(const struct passwd *pas, const char *file)

View File

@ -106,6 +106,7 @@ enum {
struct globals { struct globals {
char **my_environ; char **my_environ;
const char *startup_PATH; const char *startup_PATH;
char *shell;
} FIX_ALIASING; } FIX_ALIASING;
#define G (*(struct globals*)&bb_common_bufsiz1) #define G (*(struct globals*)&bb_common_bufsiz1)
#define INIT_G() do { } while (0) #define INIT_G() do { } while (0)
@ -986,11 +987,10 @@ static int doit(char *str)
fflush_all(); fflush_all();
child = vfork(); child = vfork();
switch (child) { if (child < 0) /* failure */
case -1: /* failure */
return 0; return 0;
case 0: /* child */ if (child == 0) { /* child */
execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, (char *) NULL, G.my_environ); execle(G.shell, G.shell, "-c", str, (char *) NULL, G.my_environ);
_exit(127); _exit(127);
} }
safe_waitpid(child, &status, 0); safe_waitpid(child, &status, 0);
@ -1165,6 +1165,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
INIT_G(); INIT_G();
G.startup_PATH = getenv("PATH"); G.startup_PATH = getenv("PATH");
G.shell = xstrdup(get_shell_name());
cmds = iface_down; cmds = iface_down;
if (applet_name[2] == 'u') { if (applet_name[2] == 'u') {

View File

@ -187,6 +187,7 @@ struct globals {
unsigned nearest_rotate; unsigned nearest_rotate;
void* (*memRchr)(const void *, int, size_t); void* (*memRchr)(const void *, int, size_t);
char *shell;
smallint exitasap; smallint exitasap;
smallint rotateasap; smallint rotateasap;
@ -382,6 +383,9 @@ static void processorstart(struct logdir *ld)
/* vfork'ed child trashes this byte, save... */ /* vfork'ed child trashes this byte, save... */
sv_ch = ld->fnsave[26]; sv_ch = ld->fnsave[26];
if (!G.shell)
G.shell = xstrdup(get_shell_name());
while ((pid = vfork()) == -1) while ((pid = vfork()) == -1)
pause2cannot("vfork for processor", ld->name); pause2cannot("vfork for processor", ld->name);
if (!pid) { if (!pid) {
@ -416,8 +420,7 @@ static void processorstart(struct logdir *ld)
fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT); fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
xmove_fd(fd, 5); xmove_fd(fd, 5);
// getenv("SHELL")? execl(G.shell, G.shell, "-c", ld->processor, (char*) NULL);
execl(DEFAULT_SHELL, DEFAULT_SHELL_SHORT_NAME, "-c", ld->processor, (char*) NULL);
bb_perror_msg_and_die(FATAL"can't %s processor %s", "run", ld->name); bb_perror_msg_and_die(FATAL"can't %s processor %s", "run", ld->name);
} }
ld->fnsave[26] = sv_ch; /* ...restore */ ld->fnsave[26] = sv_ch; /* ...restore */

View File

@ -65,10 +65,7 @@ int script_main(int argc UNUSED_PARAM, char **argv)
if (!(opt & OPT_q)) { if (!(opt & OPT_q)) {
printf("Script started, file is %s\n", fname); printf("Script started, file is %s\n", fname);
} }
shell = getenv("SHELL"); shell = get_shell_name();
if (shell == NULL) {
shell = DEFAULT_SHELL;
}
pty = xgetpty(pty_line); pty = xgetpty(pty_line);