浏览代码

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.
Roberto E. Vargas Caballero 10 年之前
父节点
当前提交
f9fb620914
共有 1 个文件被更改,包括 11 次插入9 次删除
  1. 11 9
      st.c

+ 11 - 9
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);
 }