aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/ash.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/shell/ash.c b/shell/ash.c
index dfe6d1c48..fbe8dd9e4 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -14284,11 +14284,11 @@ read_profile(const char *name)
/*
* This routine is called when an error or an interrupt occurs in an
- * interactive shell and control is returned to the main command loop.
- * (In dash, this function is auto-generated by build machinery).
+ * interactive shell and control is returned to the main command loop
+ * but prior to exitshell.
*/
static void
-reset(void)
+exitreset(void)
{
/* from eval.c: */
evalskip = 0;
@@ -14301,14 +14301,23 @@ reset(void)
/* from expand.c: */
ifsfree();
+ /* from redir.c: */
+ unwindredir(NULL);
+}
+
+/*
+ * This routine is called when an error or an interrupt occurs in an
+ * interactive shell and control is returned to the main command loop.
+ * (In dash, this function is auto-generated by build machinery).
+ */
+static void
+reset(void)
+{
/* from input.c: */
g_parsefile->left_in_buffer = 0;
g_parsefile->left_in_line = 0; /* clear input buffer */
popallfiles();
- /* from redir.c: */
- unwindredir(NULL);
-
/* from var.c: */
unwindlocalvars(NULL);
}
@@ -14356,13 +14365,16 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
smallint e;
smallint s;
- reset();
+ exitreset();
e = exception_type;
s = state;
if (e == EXEXIT || s == 0 || iflag == 0 || shlvl) {
exitshell();
}
+
+ reset();
+
if (e == EXINT) {
newline_and_flush(stderr);
}