sh: Fix $? in heredocs on simple commands.
authorPeter Avalos <pavalos@dragonflybsd.org>
Sun, 21 Aug 2011 20:10:39 +0000 (13:10 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sun, 21 Aug 2011 20:49:21 +0000 (13:49 -0700)
Obtained-from:   FreeBSD 222716

bin/sh/eval.c
tools/regression/bin/sh/expansion/heredoc2.0 [new file with mode: 0644]

index 1de8c31..567a040 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)eval.c  8.9 (Berkeley) 6/8/95
- * $FreeBSD: src/bin/sh/eval.c,v 1.106 2011/06/04 11:28:42 jilles Exp $
+ * $FreeBSD: src/bin/sh/eval.c,v 1.107 2011/06/05 14:13:15 jilles Exp $
  */
 
 #include <sys/time.h>
@@ -410,6 +410,7 @@ evalsubshell(union node *n, int flags)
        struct job *jp;
        int backgnd = (n->type == NBACKGND);
 
+       oexitstatus = exitstatus;
        expredir(n->nredir.redirect);
        if ((!backgnd && flags & EV_EXIT && !have_traps()) ||
            forkshell(jp = makejob(n, 1), n, backgnd) == 0) {
@@ -437,6 +438,7 @@ evalredir(union node *n, int flags)
        struct jmploc *savehandler;
        volatile int in_redirect = 1;
 
+       oexitstatus = exitstatus;
        expredir(n->nredir.redirect);
        savehandler = handler;
        if (setjmp(jmploc.loc)) {
@@ -479,7 +481,6 @@ expredir(union node *n)
        for (redir = n ; redir ; redir = redir->nfile.next) {
                struct arglist fn;
                fn.lastp = &fn.list;
-               oexitstatus = exitstatus;
                switch (redir->type) {
                case NFROM:
                case NTO:
diff --git a/tools/regression/bin/sh/expansion/heredoc2.0 b/tools/regression/bin/sh/expansion/heredoc2.0
new file mode 100644 (file)
index 0000000..2d86d5e
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/heredoc2.0,v 1.1 2011/06/05 14:13:15 jilles Exp $
+
+f() { return $1; }
+
+[ `f 42; cat <<EOF
+$?
+EOF
+` = 42 ] || echo simple command bad
+
+long=`printf %08192d 0`
+
+[ `f 42; cat <<EOF
+$long.$?
+EOF
+` = $long.42 ] || echo long simple command bad