From 493b9cae808093ff5d89b5fb794e3991859e7df6 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Sun, 30 Oct 2016 18:27:14 +0100
Subject: ash: make popfile() anfter popallfiles() safe

In this example:

	ash -c 'readonly x; echo $(command eval x=2)'

evalstring() is called after forkchild(), which calls popallfiles().
On exception, evalstring() will popfile().

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 shell/ash.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

(limited to 'shell')

diff --git a/shell/ash.c b/shell/ash.c
index fc1b5d927..0c8480587 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -10125,6 +10125,9 @@ popfile(void)
 {
 	struct parsefile *pf = g_parsefile;
 
+	if (pf == &basepf)
+		return;
+
 	INT_OFF;
 	if (pf->pf_fd >= 0)
 		close(pf->pf_fd);
@@ -12286,7 +12289,7 @@ expandstr(const char *ps)
 static int
 evalstring(char *s, int flags)
 {
-	struct jmploc *volatile savehandler = exception_handler;
+	struct jmploc *volatile savehandler;
 	struct jmploc jmploc;
 	int ex;
 
@@ -12307,10 +12310,10 @@ evalstring(char *s, int flags)
 	 * But if we skip popfile(), we hit EOF in eval's string, and exit.
 	 */
 	savehandler = exception_handler;
-	exception_handler = &jmploc;
 	ex = setjmp(jmploc.loc);
 	if (ex)
 		goto out;
+	exception_handler = &jmploc;
 
 	while ((n = parsecmd(0)) != NODE_EOF) {
 		int i;
-- 
cgit v1.2.3