svn commit: r216761 - in head: bin/sh tools/regression/bin/sh/expansion

Jilles Tjoelker jilles at FreeBSD.org
Tue Dec 28 13:28:24 UTC 2010


Author: jilles
Date: Tue Dec 28 13:28:24 2010
New Revision: 216761
URL: http://svn.freebsd.org/changeset/base/216761

Log:
  sh: Make expansion errors in optimized command substitution non-fatal.
  Command substitutions consisting of a single simple command are executed in
  the main shell process but this should be invisible apart from performance
  and very few exceptions such as $(trap).

Added:
  head/tools/regression/bin/sh/expansion/cmdsubst5.0   (contents, props changed)
Modified:
  head/bin/sh/eval.c

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c	Tue Dec 28 12:37:57 2010	(r216760)
+++ head/bin/sh/eval.c	Tue Dec 28 13:28:24 2010	(r216761)
@@ -578,6 +578,8 @@ evalbackcmd(union node *n, struct backcm
 	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 backcm
 	}
 	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)

Added: head/tools/regression/bin/sh/expansion/cmdsubst5.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/expansion/cmdsubst5.0	Tue Dec 28 13:28:24 2010	(r216761)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+unset v
+exec 2>/dev/null
+! y=$(: ${v?})


More information about the svn-src-head mailing list