summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/sh/eval.c16
-rw-r--r--tools/regression/bin/sh/expansion/cmdsubst5.05
2 files changed, 20 insertions, 1 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index 5bae2f2..596a86c 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -578,6 +578,8 @@ evalbackcmd(union node *n, struct backcmd *result)
int pip[2];
struct job *jp;
struct stackmark smark; /* unnecessary */
+ struct jmploc jmploc;
+ struct jmploc *savehandler;
setstackmark(&smark);
result->fd = -1;
@@ -590,7 +592,19 @@ evalbackcmd(union node *n, struct backcmd *result)
}
if (n->type == NCMD) {
exitstatus = oexitstatus;
- evalcommand(n, EV_BACKCMD, result);
+ savehandler = handler;
+ if (setjmp(jmploc.loc)) {
+ if (exception == EXERROR || exception == EXEXEC)
+ exitstatus = 2;
+ else if (exception != 0) {
+ handler = savehandler;
+ longjmp(handler->loc, 1);
+ }
+ } else {
+ handler = &jmploc;
+ evalcommand(n, EV_BACKCMD, result);
+ }
+ handler = savehandler;
} else {
exitstatus = 0;
if (pipe(pip) < 0)
diff --git a/tools/regression/bin/sh/expansion/cmdsubst5.0 b/tools/regression/bin/sh/expansion/cmdsubst5.0
new file mode 100644
index 0000000..afca371
--- /dev/null
+++ b/tools/regression/bin/sh/expansion/cmdsubst5.0
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+unset v
+exec 2>/dev/null
+! y=$(: ${v?})
OpenPOWER on IntegriCloud