aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-10-30 18:27:14 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2016-10-30 18:27:14 +0100
commit493b9cae808093ff5d89b5fb794e3991859e7df6 (patch)
tree05b59197059c377c39dbacef3cc7238843e080ca
parent9db74e49e5b462089c6eec0182d819c0d4708e57 (diff)
downloadbusybox-w32-493b9cae808093ff5d89b5fb794e3991859e7df6.tar.gz
busybox-w32-493b9cae808093ff5d89b5fb794e3991859e7df6.tar.bz2
busybox-w32-493b9cae808093ff5d89b5fb794e3991859e7df6.zip
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>
-rw-r--r--shell/ash.c7
1 files changed, 5 insertions, 2 deletions
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)
10125{ 10125{
10126 struct parsefile *pf = g_parsefile; 10126 struct parsefile *pf = g_parsefile;
10127 10127
10128 if (pf == &basepf)
10129 return;
10130
10128 INT_OFF; 10131 INT_OFF;
10129 if (pf->pf_fd >= 0) 10132 if (pf->pf_fd >= 0)
10130 close(pf->pf_fd); 10133 close(pf->pf_fd);
@@ -12286,7 +12289,7 @@ expandstr(const char *ps)
12286static int 12289static int
12287evalstring(char *s, int flags) 12290evalstring(char *s, int flags)
12288{ 12291{
12289 struct jmploc *volatile savehandler = exception_handler; 12292 struct jmploc *volatile savehandler;
12290 struct jmploc jmploc; 12293 struct jmploc jmploc;
12291 int ex; 12294 int ex;
12292 12295
@@ -12307,10 +12310,10 @@ evalstring(char *s, int flags)
12307 * But if we skip popfile(), we hit EOF in eval's string, and exit. 12310 * But if we skip popfile(), we hit EOF in eval's string, and exit.
12308 */ 12311 */
12309 savehandler = exception_handler; 12312 savehandler = exception_handler;
12310 exception_handler = &jmploc;
12311 ex = setjmp(jmploc.loc); 12313 ex = setjmp(jmploc.loc);
12312 if (ex) 12314 if (ex)
12313 goto out; 12315 goto out;
12316 exception_handler = &jmploc;
12314 12317
12315 while ((n = parsecmd(0)) != NODE_EOF) { 12318 while ((n = parsecmd(0)) != NODE_EOF) {
12316 int i; 12319 int i;