Module Name:    src
Committed By:   martin
Date:           Thu Dec 26 20:16:47 UTC 2019

Modified Files:
        src/bin/sh [netbsd-9]: eval.c

Log Message:
Pull up following revision(s) (requested by kre in ticket #582):

        bin/sh/eval.c: revision 1.177

Use fork() rather than vfork() when forking to run a background
process with redirects.   If we use vfork() and a redirect hangs
(eg: opening a fifo) which the parent was intended to unhang,
then the parent never gets to continue to unhang the child.
eg:  mkfifo f; cat <f &; echo foo>f

The parent should not be waiting for a background process, even
just for its exec() to complete.   if there are no redirects there
is (should be) nothing left that might be done that will cause any
noticeable delay, so vfork() should be safe in all other cases.


To generate a diff of this commit:
cvs rdiff -u -r1.175.2.1 -r1.175.2.2 src/bin/sh/eval.c

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.175.2.1 src/bin/sh/eval.c:1.175.2.2
--- src/bin/sh/eval.c:1.175.2.1	Wed Dec 11 14:52:50 2019
+++ src/bin/sh/eval.c	Thu Dec 26 20:16:47 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: eval.c,v 1.175.2.1 2019/12/11 14:52:50 martin Exp $	*/
+/*	$NetBSD: eval.c,v 1.175.2.2 2019/12/26 20:16:47 martin 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.175.2.1 2019/12/11 14:52:50 martin Exp $");
+__RCSID("$NetBSD: eval.c,v 1.175.2.2 2019/12/26 20:16:47 martin Exp $");
 #endif
 #endif /* not lint */
 
@@ -552,8 +552,8 @@ evalsubshell(union node *n, int flags)
 	    forkshell(jp = makejob(n, 1), n, backgnd?FORK_BG:FORK_FG) == 0) {
 		if (backgnd)
 			flags &=~ EV_TESTED;
-		redirect(n->nredir.redirect, REDIR_KEEP);
 		INTON;
+		redirect(n->nredir.redirect, REDIR_KEEP);
 		evaltree(n->nredir.n, flags | EV_EXIT);   /* never returns */
 	} else if (backgnd)
 		exitstatus = 0;
@@ -1086,7 +1086,8 @@ evalcommand(union node *cmd, int flgs, s
 		 * child's address space is actually shared with the parent as
 		 * we rely on this.
 		 */
-		if (usefork == 0 && cmdentry.cmdtype == CMDNORMAL) {
+		if (usefork == 0 && cmdentry.cmdtype == CMDNORMAL &&
+		    (!cmd->ncmd.backgnd || cmd->ncmd.redirect == NULL)) {
 			pid_t	pid;
 			int serrno;
 

Reply via email to