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:
parent
86cf0364bd
commit
681efe20d3
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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();
|
||||||
|
@ -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)
|
||||||
|
@ -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') {
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user