diff --git a/shell/ash.c b/shell/ash.c
index 0490f7f7d..b404449d0 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -5462,16 +5462,6 @@ popredir(int drop, int restore)
  * Undo all redirections.  Called on error or interrupt.
  */
 
-/*
- * Discard all saved file descriptors.
- */
-static void
-clearredir(int drop)
-{
-	while (redirlist)
-		popredir(drop, /*restore:*/ 0);
-}
-
 static int
 redirectsafe(union node *redir, int flags)
 {
@@ -7559,7 +7549,6 @@ shellexec(char **argv, const char *path, int idx)
 	int exerrno;
 	int applet_no = -1; /* used only by FEATURE_SH_STANDALONE */
 
-	clearredir(/*drop:*/ 1);
 	envp = listvars(VEXPORT, VUNSET, /*end:*/ NULL);
 	if (strchr(argv[0], '/') != NULL
 #if ENABLE_FEATURE_SH_STANDALONE
@@ -10191,7 +10180,6 @@ closescript(void)
 static void
 setinputfd(int fd, int push)
 {
-	close_on_exec_on(fd);
 	if (push) {
 		pushfile();
 		g_parsefile->buf = NULL;
@@ -10223,6 +10211,8 @@ setinputfile(const char *fname, int flags)
 	}
 	if (fd < 10)
 		fd = savefd(fd);
+	else
+		close_on_exec_on(fd);
 	setinputfd(fd, flags & INPUT_PUSH_FILE);
  out:
 	INT_ON;
@@ -13339,7 +13329,8 @@ reset(void)
 	tokpushback = 0;
 	checkkwd = 0;
 	/* from redir.c: */
-	clearredir(/*drop:*/ 0);
+	while (redirlist)
+		popredir(/*drop:*/ 0, /*restore:*/ 0);
 }
 
 #if PROFILE