PR-5071266.patch   [plain text]


--- /SourceCache/gnumake/gnumake-121/make/job.c	2007-01-29 17:28:17.000000000 -0800
+++ ./job.c	2008-10-15 18:53:33.000000000 -0700
@@ -29,6 +29,9 @@ Foundation, Inc., 51 Franklin St, Fifth 
 
 #include <string.h>
 
+#if USE_POSIX_SPAWN
+#include <spawn.h>
+#endif
 /* Default shell to use.  */
 #ifdef WINDOWS32
 #include <windows.h>
@@ -1295,6 +1298,42 @@ start_job_command (struct child *child)
 
 #else  /* !__EMX__ */
 
+#if USE_POSIX_SPAWN
+      posix_spawn_file_actions_t file_actions;
+      posix_spawnattr_t attr;
+      sigset_t nosigs, allsigs;
+      int rc;
+      struct stat stat;
+      short spawn_flags = 0;
+
+      posix_spawn_file_actions_init(&file_actions);
+      if (!(flags & COMMANDS_RECURSE)) {
+	if (job_fds[0] >= 0 && fstat(job_fds[0], &stat)) 
+	  posix_spawn_file_actions_addclose(&file_actions, job_fds[0]);
+	if (job_fds[1] >= 0 && fstat(job_fds[1], &stat))
+	  posix_spawn_file_actions_addclose(&file_actions, job_fds[1]);
+      }
+      if (job_rfd >= 0 && fstat(job_rfd, &stat))
+	posix_spawn_file_actions_addclose(&file_actions, job_rfd);
+      if (!child->good_stdin && fstat(bad_stdin, &stat))
+	posix_spawn_file_actions_adddup2(&file_actions, bad_stdin, 0);
+      posix_spawnattr_init(&attr);
+      sigemptyset(&nosigs);
+      sigfillset(&allsigs);
+      posix_spawnattr_setsigmask(&attr, &nosigs);
+      posix_spawnattr_setsigdefault(&attr, &allsigs);
+      posix_spawnattr_getflags(&attr, &spawn_flags);
+      spawn_flags |= POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK;
+      posix_spawnattr_setflags(&attr, spawn_flags);
+      rc = posix_spawnp(&child->pid, argv[0], &file_actions, &attr, argv, child->environment);
+      environ = parent_environ;
+      posix_spawnattr_destroy(&attr);
+      posix_spawn_file_actions_destroy(&file_actions);
+      if (rc) {
+	error (NILF, _("%s: %s"), argv[0], strerror(rc));
+	rc = posix_spawnp(&child->pid, "/usr/bin/false", NULL, NULL, NULL, NULL);
+      }
+#else  /* !USE_POSIX_SPAWN */
       child->pid = vfork ();
       environ = parent_environ;	/* Restore value child may have clobbered.  */
       if (child->pid == 0)
@@ -1322,6 +1361,7 @@ start_job_command (struct child *child)
 	  perror_with_name ("vfork", "");
 	  goto error;
 	}
+#  endif /* !USE_POSIX_SPAWN */
 # endif  /* !__EMX__ */
 #endif /* !VMS */
     }
diff -up /SourceCache/gnumake/gnumake-121/make/main.c ./main.c
--- /SourceCache/gnumake/gnumake-121/make/main.c	2008-06-19 19:55:59.000000000 -0700
+++ ./main.c	2008-08-25 22:09:52.000000000 -0700
@@ -2141,8 +2141,10 @@ main (int argc, char **argv, char **envp
 	  fflush (stderr);
 
           /* Close the dup'd jobserver pipe if we opened one.  */
-          if (job_rfd >= 0)
+          if (job_rfd >= 0) {
             close (job_rfd);
+	    job_rfd = -1;
+	  }
 
 #ifdef _AMIGA
 	  exec_command (nargv);
@@ -3108,7 +3110,7 @@ clean_jobserver (int status)
 
       /* Close the write side, so the read() won't hang.  */
       close (job_fds[1]);
-
+      job_fds[1] = -1;
       while (read (job_fds[0], &token, 1) == 1)
         ++tcnt;
 
@@ -3118,6 +3120,7 @@ clean_jobserver (int status)
                tcnt, master_job_slots);
 
       close (job_fds[0]);
+      job_fds[0] = -1;
     }
 }