Module Name:    src
Committed By:   christos
Date:           Sat Mar 12 21:35:13 UTC 2016

Modified Files:
        src/bin/sh: eval.c redir.c redir.h

Log Message:
Don't close-on-exec redirections created explicitly for the command being
ran; i.e. we want this to work:
        $ cat succ1
        #!/bin/sh
        ./succ2 6>out

        $ cat succ2
        #!/bin/sh
        echo succ2 >&6

        $ ./succ1

And this to fail:
        $ cat fail1
        #!/bin/sh
        exec 6> out
        echo "fail1" >&6
        ./fail2
        exec 6>&-

        $ cat fail2
        #!obj.amd64/sh
        echo "fail2" >&6

        $ ./fail1
        ./fail2: 6: Bad file descriptor

XXX: Do we want a -k (keep flag on exec to make redirections not close-on-exec?


To generate a diff of this commit:
cvs rdiff -u -r1.116 -r1.117 src/bin/sh/eval.c
cvs rdiff -u -r1.39 -r1.40 src/bin/sh/redir.c
cvs rdiff -u -r1.17 -r1.18 src/bin/sh/redir.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/bin/sh/eval.c
diff -u src/bin/sh/eval.c:1.116 src/bin/sh/eval.c:1.117
--- src/bin/sh/eval.c:1.116	Sat Mar 12 09:59:26 2016
+++ src/bin/sh/eval.c	Sat Mar 12 16:35:13 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: eval.c,v 1.116 2016/03/12 14:59:26 christos Exp $	*/
+/*	$NetBSD: eval.c,v 1.117 2016/03/12 21:35:13 christos Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)eval.c	8.9 (Berkeley) 6/8/95";
 #else
-__RCSID("$NetBSD: eval.c,v 1.116 2016/03/12 14:59:26 christos Exp $");
+__RCSID("$NetBSD: eval.c,v 1.117 2016/03/12 21:35:13 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -1118,7 +1118,8 @@ normal_fork:
 #ifdef DEBUG
 		trputs("normal command:  ");  trargs(argv);
 #endif
-		redirect(cmd->ncmd.redirect, vforked ? REDIR_VFORK : 0);
+		redirect(cmd->ncmd.redirect, 
+		    (vforked ? REDIR_VFORK : 0) | REDIR_KEEP);
 		if (!vforked)
 			for (sp = varlist.list ; sp ; sp = sp->next)
 				setvareq(sp->text, VEXPORT|VSTACK);

Index: src/bin/sh/redir.c
diff -u src/bin/sh/redir.c:1.39 src/bin/sh/redir.c:1.40
--- src/bin/sh/redir.c:1.39	Mon Jan  4 08:57:15 2016
+++ src/bin/sh/redir.c	Sat Mar 12 16:35:13 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: redir.c,v 1.39 2016/01/04 13:57:15 christos Exp $	*/
+/*	$NetBSD: redir.c,v 1.40 2016/03/12 21:35:13 christos Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)redir.c	8.2 (Berkeley) 5/4/95";
 #else
-__RCSID("$NetBSD: redir.c,v 1.39 2016/01/04 13:57:15 christos Exp $");
+__RCSID("$NetBSD: redir.c,v 1.40 2016/03/12 21:35:13 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -244,7 +244,7 @@ openredirect(union node *redir, char mem
 	}
 
 	if (f != fd) {
-		copyfd(f, fd, 1, fd > 2);
+		copyfd(f, fd, 1, fd > 2 && (flags & REDIR_KEEP) == 0);
 		close(f);
 	} else if (f > 2)
 		(void)fcntl(f, F_SETFD, FD_CLOEXEC);

Index: src/bin/sh/redir.h
diff -u src/bin/sh/redir.h:1.17 src/bin/sh/redir.h:1.18
--- src/bin/sh/redir.h:1.17	Sun Jan  3 22:00:24 2016
+++ src/bin/sh/redir.h	Sat Mar 12 16:35:13 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: redir.h,v 1.17 2016/01/04 03:00:24 christos Exp $	*/
+/*	$NetBSD: redir.h,v 1.18 2016/03/12 21:35:13 christos Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -35,9 +35,10 @@
  */
 
 /* flags passed to redirect */
-#define REDIR_PUSH 01		/* save previous values of file descriptors */
-#define REDIR_BACKQ 02		/* save the command output in memory */
-#define REDIR_VFORK 04		/* running under vfork(2), be careful */
+#define REDIR_PUSH  0x01	/* save previous values of file descriptors */
+#define REDIR_BACKQ 0x02	/* save the command output in memory */
+#define REDIR_VFORK 0x04	/* running under vfork(2), be careful */
+#define REDIR_KEEP  0x08	/* don't close-on-exec */
 
 union node;
 void redirect(union node *, int);

Reply via email to