su: check $SHELL for validity

If $SHELL isn't defined in the environment, the call to execve will
fail when -p is specified. Fallback to the user's login shell if $SHELL
is invalid.
This commit is contained in:
neeshy 2024-02-12 21:41:02 -05:00 committed by Roberto E. Vargas Caballero
parent cf9e26d7fa
commit e9bcdcc341
1 changed files with 4 additions and 2 deletions

6
su.c
View File

@ -28,7 +28,7 @@ int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
char *usr = "root", *pass; char *usr = "root", *pass;
char *shell, *term; char *shell, *envshell, *term;
struct passwd *pw; struct passwd *pw;
char *newargv[3]; char *newargv[3];
uid_t uid; uid_t uid;
@ -89,7 +89,9 @@ main(int argc, char *argv[])
newargv[2] = NULL; newargv[2] = NULL;
} else { } else {
if (pflag) { if (pflag) {
shell = getenv("SHELL"); envshell = getenv("SHELL");
if (envshell && envshell[0] != '\0')
shell = envshell;
} else { } else {
setenv("HOME", pw->pw_dir, 1); setenv("HOME", pw->pw_dir, 1);
setenv("SHELL", shell, 1); setenv("SHELL", shell, 1);