]> err.no Git - moreutils/commitdiff
mispipe: Fix closing of extra pipe FD before starting command so it is not inherited...
authorJoey Hess <joey@gnu.kitenet.net>
Thu, 2 Jul 2009 19:58:38 +0000 (15:58 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Thu, 2 Jul 2009 19:58:38 +0000 (15:58 -0400)
debian/changelog
mispipe.c

index bcdebf4b7d0f8f18201a42745c94758a965cc7e3..b7f0d3e8c809cb84101050db1e77f852b9b1a169 100644 (file)
@@ -3,6 +3,9 @@ moreutils (0.36) UNRELEASED; urgency=low
   * parallel: New program, contributed by Tollef Fog Heen,
     that can run multiple jobs in parallel, optionally checking
     load average.
+  * mispipe: Fix closing of extra pipe FD before starting command
+    so it is not inherited by daemons. Closes: #533448
+    (Thanks, Jeremie Koenig)
 
  -- Joey Hess <joeyh@debian.org>  Thu, 02 Jul 2009 14:57:12 -0400
 
index 43ba76aa6f3d24cfe8bb90b3776b044f27df9d37..d183d04a5f249072da9be3e1d30d4e205e1be021 100644 (file)
--- a/mispipe.c
+++ b/mispipe.c
@@ -107,15 +107,15 @@ static void subprocess2(const char* cmd) {
        /* Make the reading end of the pipe the new standard input. */
        if (dup2(filedes[0], 0) == -1)
                error_with_errno("Failed (in child) redefining standard input");
+       /* Close the original file descriptor for it */
+       if (close(filedes[0]))
+               error_with_errno("Failed (in child) closing filedes[0]");
        /* Close the other end of the pipe. */
        if (close(filedes[1]))
                error_with_errno("Failed (in child) closing filedes[1]");
        /* Do the second command, and throw away the exit status. */
        system(cmd);
-       /* Close all the file descriptors. */
-       if (close(filedes[0]))
-               error_with_errno("Failed (in child) closing filedes[0]"
-                       " (while cleaning up)");
+       /* Close the standard input. */
        if (close(0))
                error_with_errno("Failed (in child) closing standard output "
                        " (while cleaning up)");
@@ -151,15 +151,15 @@ int main (int argc, const char ** argv) {
        /* Make the writing end of the pipe the new standard output. */
        if (dup2(filedes[1], 1) == -1)
                error_with_errno("Failed redefining standard output");
+       /* Close the original file descriptor for it. */
+       if (close(filedes[1]))
+               error_with_errno("Failed closing filedes[1]");
        /* Close the other end of the pipe. */
        if (close(filedes[0]))
                error_with_errno("Failed closing filedes[0]");
        /* Do the first command, and (crucially) get the status. */
        status_big = system(argv[1]);
 
-       /* Close the pipe "standard output". */
-       if (close(filedes[1]))
-               error_with_errno("Failed closing filedes[1] (while cleaning up)");
        /* Close standard output. */
        if (close(1))
                error_with_errno("Failed closing standard output (while cleaning up)");