support: Close original descriptors in support_capture_subprocess

Message ID 87muppklg5.fsf@oldenburg.str.redhat.com
State Committed
Headers

Commit Message

Florian Weimer Dec. 1, 2018, 9:04 p.m. UTC
  * Andreas Schwab:

> On Dez 01 2018, Florian Weimer <fweimer@redhat.com> wrote:
>
>> This means that stdout_pipe[1] is at least 1 and stderr_pipe[1] is at
>> least 3.  We can never close descriptor 0, but the first xclose could
>> close descriptor 1 or 2.  Should I remove the second if condition?
>
> IMHO it would be cleaner that if a test needs a closed standard fd there
> should be a separate functionality to set that up instead of letting the
> test close it directly.

What about this?

Thanks,
Florian

2018-12-01  Florian Weimer  <fweimer@redhat.com>

	* support/support_capture_subprocess.c
	(support_capture_subprocess): Check that pipe descriptors have
	expected values.  Close original pipe descriptors in subprocess.
  

Comments

Andreas Schwab Dec. 1, 2018, 9:14 p.m. UTC | #1
On Dez 01 2018, Florian Weimer <fweimer@redhat.com> wrote:

> 2018-12-01  Florian Weimer  <fweimer@redhat.com>
>
> 	* support/support_capture_subprocess.c
> 	(support_capture_subprocess): Check that pipe descriptors have
> 	expected values.  Close original pipe descriptors in subprocess.

Ok.

Andreas.
  

Patch

diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c
index 6d2029e13b..93f6ea3102 100644
--- a/support/support_capture_subprocess.c
+++ b/support/support_capture_subprocess.c
@@ -59,8 +59,12 @@  support_capture_subprocess (void (*callback) (void *), void *closure)
 
   int stdout_pipe[2];
   xpipe (stdout_pipe);
+  TEST_VERIFY (stdout_pipe[0] > STDERR_FILENO);
+  TEST_VERIFY (stdout_pipe[1] > STDERR_FILENO);
   int stderr_pipe[2];
   xpipe (stderr_pipe);
+  TEST_VERIFY (stderr_pipe[0] > STDERR_FILENO);
+  TEST_VERIFY (stderr_pipe[1] > STDERR_FILENO);
 
   TEST_VERIFY (fflush (stdout) == 0);
   TEST_VERIFY (fflush (stderr) == 0);
@@ -72,6 +76,8 @@  support_capture_subprocess (void (*callback) (void *), void *closure)
       xclose (stderr_pipe[0]);
       xdup2 (stdout_pipe[1], STDOUT_FILENO);
       xdup2 (stderr_pipe[1], STDERR_FILENO);
+      xclose (stdout_pipe[1]);
+      xclose (stderr_pipe[1]);
       callback (closure);
       _exit (0);
     }