bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

pipe-filter-gi: fix


From: Bruno Haible
Subject: pipe-filter-gi: fix
Date: Sat, 20 Mar 2010 17:20:39 +0100
User-agent: KMail/1.9.9

On MacOS X 10.5, I'm seeing this test failure:

  test-pipe-filter-gi2-main.c:89: assertion failed
  FAIL: test-pipe-filter-gi2.sh

The reason is that pipe-filter-gi.c assumes that create_pipe_bidi sets errno
when it fails, but it does not actually do so. This fixes it.


2010-03-20  Bruno Haible  <address@hidden>

        pipe: Set errno upon failure.
        * lib/pipe.h: Specify that when -1 is returned, errno is set.
        * lib/pipe.c (create_pipe): Set errno when returning -1. Use the right
        errno value in error message.

--- lib/pipe.c.orig     Sat Mar 20 17:18:07 2010
+++ lib/pipe.c  Sat Mar 20 17:13:15 2010
@@ -128,6 +128,7 @@
   int nulloutfd;
   int stdinfd;
   int stdoutfd;
+  int saved_errno;
 
   /* FIXME: Need to free memory allocated by prepare_spawn.  */
   prog_argv = prepare_spawn (prog_argv);
@@ -203,6 +204,8 @@
                             (const char **) environ);
         }
     }
+  if (child == -1)
+    saved_errno = errno;
   if (stdinfd >= 0)
     close (stdinfd);
   if (stdoutfd >= 0)
@@ -225,12 +228,13 @@
   if (child == -1)
     {
       if (exit_on_error || !null_stderr)
-        error (exit_on_error ? EXIT_FAILURE : 0, errno,
+        error (exit_on_error ? EXIT_FAILURE : 0, saved_errno,
                _("%s subprocess failed"), progname);
       if (pipe_stdout)
         close (ifd[0]);
       if (pipe_stdin)
         close (ofd[1]);
+      errno = saved_errno;
       return -1;
     }
 
@@ -350,6 +354,7 @@
           close (ofd[0]);
           close (ofd[1]);
         }
+      errno = err;
       return -1;
     }
   posix_spawn_file_actions_destroy (&actions);
--- lib/pipe.h.orig     Sat Mar 20 17:18:07 2010
+++ lib/pipe.h  Sat Mar 20 17:13:14 2010
@@ -36,7 +36,8 @@
    one or two file descriptors for communication with the subprocess.
    If the subprocess creation fails: if exit_on_error is true, the main
    process exits with an error message; otherwise, an error message is given
-   if null_stderr is false, then -1 is returned and fd[] remain uninitialized.
+   if null_stderr is false, then -1 is returned, with errno set, and fd[]
+   remain uninitialized.
 
    After finishing communication, the caller should call wait_subprocess()
    to get rid of the subprocess in the process table.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]