summaryrefslogtreecommitdiff
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
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.
-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);
}