use user's shell instead of hardwired "/bin/sh" (android needs this)
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 8 Mar 2011 20:00:36 +0000 (21:00 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 8 Mar 2011 20:00:36 +0000 (21:00 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
12 files changed:
archival/libarchive/data_extract_to_command.c
archival/tar.c
console-tools/openvt.c
coreutils/chroot.c
include/archive.h
include/libbb.h
loginutils/adduser.c
miscutils/conspy.c
miscutils/crontab.c
networking/ifupdown.c
runit/svlogd.c
util-linux/script.c

index 2bbab76416c782b47c57c79f3a74a9be31640e41..0e977049d8db676a9ce3d730e113e57e31999122 100644 (file)
@@ -99,8 +99,12 @@ void FAST_FUNC data_extract_to_command(archive_handle_t *archive_handle)
                        close(p[1]);
                        xdup2(p[0], STDIN_FILENO);
                        signal(SIGPIPE, SIG_DFL);
-                       execl(DEFAULT_SHELL, DEFAULT_SHELL_SHORT_NAME, "-c", archive_handle->tar__to_command, NULL);
-                       bb_perror_msg_and_die("can't execute '%s'", DEFAULT_SHELL);
+                       execl(archive_handle->tar__to_command_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]);
                /* Our caller is expected to do signal(SIGPIPE, SIG_IGN)
index d43c8dee365c31c3e3fed3eaccdb04ea3dfb594d..01b83d5e2c785f418c5cc970a582a18dea9d5508 100644 (file)
@@ -970,6 +970,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
                putenv((char*)"TAR_FILETYPE=f");
                signal(SIGPIPE, SIG_IGN);
                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)
index 6e0b589a0cbd78f172f94064fae66a3783a59a8e..56f50c6cd49933ed85c1e352c4530700ef70d710 100644 (file)
@@ -144,9 +144,7 @@ int openvt_main(int argc UNUSED_PARAM, char **argv)
 
        if (!argv[0]) {
                argv--;
-               argv[0] = getenv("SHELL");
-               if (!argv[0])
-                       argv[0] = (char *) DEFAULT_SHELL;
+               argv[0] = (char *) get_shell_name();
                /*argv[1] = NULL; - already is */
        }
 
index b80a12ee013769c1ecc026aea3a185d6d674a61e..5ac2e890e1e2c1e50f12eee053ec73fd6f68fb5f 100644 (file)
@@ -23,11 +23,9 @@ int chroot_main(int argc UNUSED_PARAM, char **argv)
        ++argv;
        if (!*argv) { /* no 2nd param (PROG), use shell */
                argv -= 2;
-               argv[0] = getenv("SHELL");
-               if (!argv[0]) {
-                       argv[0] = (char *) DEFAULT_SHELL;
-               }
-               argv[1] = (char *) "-i";
+               argv[0] = (char *) get_shell_name();
+               argv[1] = (char *) "-i"; /* GNU coreutils 8.4 compat */
+               /*argv[2] = NULL; - already is */
        }
 
        BB_EXECVP_or_die(argv);
index 181c187f750cafda705949566ed44482ccb66d15..b139dc5be6957a6f340fa190458029356c86f809 100644 (file)
@@ -84,6 +84,7 @@ typedef struct archive_handle_t {
 # endif
 #if ENABLE_FEATURE_TAR_TO_COMMAND
        char* tar__to_command;
+       const char* tar__to_command_shell;
 #endif
 # if ENABLE_FEATURE_TAR_SELINUX
        char* tar__global_sctx;
index c26012c5d8a4a05161ae86ada1142400479c9e49..c371e35f2b8bf75e81d4d5a7cbbd16d37514d967 100644 (file)
@@ -1198,10 +1198,17 @@ char *bb_simplify_path(const char *path) FAST_FUNC;
 /* Returns ptr to NUL */
 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 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;
+
+/* 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
 extern void renew_current_security_context(void) FAST_FUNC;
 extern void set_current_security_context(security_context_t sid) FAST_FUNC;
index 9d3d9cb4c6b24a7ee1691b7dbe69f89e51877a9c..0c675caf9106d6dd6a535db2ca297eff89617e10 100644 (file)
@@ -132,7 +132,8 @@ int adduser_main(int argc UNUSED_PARAM, char **argv)
        }
 
        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;
 
        /* exactly one non-option arg */
index 1fdb2fb386330c0f6bfd2393d999d61dcece24b7..9c5405332c2e276d1ca475c303c44bc26e30d670 100644 (file)
@@ -316,10 +316,8 @@ static NOINLINE void start_shell_in_child(const char* tty_name)
        int pid = xvfork();
        if (pid == 0) {
                struct termios termchild;
-               char *shell = getenv("SHELL");
+               const char *shell = get_shell_name();
 
-               if (!shell)
-                       shell = (char *) DEFAULT_SHELL;
                signal(SIGHUP, SIG_IGN);
                // set tty as a controlling tty
                setsid();
index 163e15dce1413123be56d2cb458e8c8385baa247..16d7fdf69c9855cf084a27d3d1f57b831d70f479 100644 (file)
@@ -20,8 +20,9 @@
 static void edit_file(const struct passwd *pas, const char *file)
 {
        const char *ptr;
-       int pid = xvfork();
+       pid_t pid;
 
+       pid = xvfork();
        if (pid) { /* parent */
                wait4pid(pid);
                return;
@@ -30,7 +31,7 @@ static void edit_file(const struct passwd *pas, const char *file)
        /* CHILD - change user and run editor */
        /* initgroups, setgid, setuid */
        change_identity(pas);
-       setup_environment(DEFAULT_SHELL,
+       setup_environment(pas->pw_shell,
                        SETUP_ENV_CHANGEENV | SETUP_ENV_TO_TMP,
                        pas);
        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_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)
index c7b560bf82ee1db98577f67c83ddbd0e1d78705d..7706a84b7e1134bec09b58f88ead0b513cf75819 100644 (file)
@@ -106,6 +106,7 @@ enum {
 struct globals {
        char **my_environ;
        const char *startup_PATH;
+       char *shell;
 } FIX_ALIASING;
 #define G (*(struct globals*)&bb_common_bufsiz1)
 #define INIT_G() do { } while (0)
@@ -986,11 +987,10 @@ static int doit(char *str)
 
                fflush_all();
                child = vfork();
-               switch (child) {
-               case -1: /* failure */
+               if (child < 0) /* failure */
                        return 0;
-               case 0: /* child */
-                       execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, (char *) NULL, G.my_environ);
+               if (child == 0) { /* child */
+                       execle(G.shell, G.shell, "-c", str, (char *) NULL, G.my_environ);
                        _exit(127);
                }
                safe_waitpid(child, &status, 0);
@@ -1165,6 +1165,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
        INIT_G();
 
        G.startup_PATH = getenv("PATH");
+       G.shell = xstrdup(get_shell_name());
 
        cmds = iface_down;
        if (applet_name[2] == 'u') {
index cfa20a77348ab6255cf2cd12d9e6ad444da6b8d3..b0ba21bb638fa2be413b5a8cf2877e6362e2546a 100644 (file)
@@ -187,6 +187,7 @@ struct globals {
        unsigned nearest_rotate;
 
        void* (*memRchr)(const void *, int, size_t);
+       char *shell;
 
        smallint exitasap;
        smallint rotateasap;
@@ -382,6 +383,9 @@ static void processorstart(struct logdir *ld)
        /* vfork'ed child trashes this byte, save... */
        sv_ch = ld->fnsave[26];
 
+       if (!G.shell)
+               G.shell = xstrdup(get_shell_name());
+
        while ((pid = vfork()) == -1)
                pause2cannot("vfork for processor", ld->name);
        if (!pid) {
@@ -416,8 +420,7 @@ static void processorstart(struct logdir *ld)
                fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
                xmove_fd(fd, 5);
 
-// getenv("SHELL")?
-               execl(DEFAULT_SHELL, DEFAULT_SHELL_SHORT_NAME, "-c", ld->processor, (char*) NULL);
+               execl(G.shell, G.shell, "-c", ld->processor, (char*) NULL);
                bb_perror_msg_and_die(FATAL"can't %s processor %s", "run", ld->name);
        }
        ld->fnsave[26] = sv_ch; /* ...restore */
index b9317fc7c11de8a863e42291bf52e55413e89c16..47efc4526949f3d74ff7706a3b09bce907dc7abf 100644 (file)
@@ -65,10 +65,7 @@ int script_main(int argc UNUSED_PARAM, char **argv)
        if (!(opt & OPT_q)) {
                printf("Script started, file is %s\n", fname);
        }
-       shell = getenv("SHELL");
-       if (shell == NULL) {
-               shell = DEFAULT_SHELL;
-       }
+       shell = get_shell_name();
 
        pty = xgetpty(pty_line);