summaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2014-10-15 19:42:20 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2014-10-15 19:42:20 +0200
commitf9fb620914f7b1e2580a890f23b66e18762788b7 (patch)
treea55b85c9120d5c49466e247d5358bfcba17f1df9 /st.c
parent86633ada91d1c7d8be1bf0398caff8a62fb1b805 (diff)
Do not set SHELL to utmp ever
SHELL must be set to the SHELL of the user, but it was possible set it to utmp.
Diffstat (limited to 'st.c')
-rw-r--r--st.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/st.c b/st.c
index c61b90a..bcf96e9 100644
--- a/st.c
+++ b/st.c
@@ -1146,7 +1146,7 @@ die(const char *errstr, ...) {
void
execsh(void) {
- char **args, *sh;
+ char **args, *sh, *prog;
const struct passwd *pw;
char buf[sizeof(long) * 8 + 1];
@@ -1158,13 +1158,15 @@ execsh(void) {
die("who are you?\n");
}
- if (utmp)
- sh = utmp;
- else if (pw->pw_shell[0])
- sh = pw->pw_shell;
+ sh = (pw->pw_shell[0]) ? pw->pw_shell : shell;
+ if(opt_cmd)
+ prog = opt_cmd[0];
+ else if(utmp)
+ prog = utmp;
else
- sh = shell;
- args = (opt_cmd) ? opt_cmd : (char *[]){sh, NULL};
+ prog = sh;
+ args = (opt_cmd) ? opt_cmd : (char *[]) {prog, NULL};
+
snprintf(buf, sizeof(buf), "%lu", xw.win);
unsetenv("COLUMNS");
@@ -1172,7 +1174,7 @@ execsh(void) {
unsetenv("TERMCAP");
setenv("LOGNAME", pw->pw_name, 1);
setenv("USER", pw->pw_name, 1);
- setenv("SHELL", args[0], 1);
+ setenv("SHELL", sh, 1);
setenv("HOME", pw->pw_dir, 1);
setenv("TERM", termname, 1);
setenv("WINDOWID", buf, 1);
@@ -1184,7 +1186,7 @@ execsh(void) {
signal(SIGTERM, SIG_DFL);
signal(SIGALRM, SIG_DFL);
- execvp(args[0], args);
+ execvp(prog, args);
exit(EXIT_FAILURE);
}