]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Assume that pipe2 is always available
authorFlorian Weimer <fweimer@redhat.com>
Tue, 18 Apr 2017 12:09:01 +0000 (14:09 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 18 Apr 2017 12:09:01 +0000 (14:09 +0200)
The Debian patches for Hurd (which are already required to build
glibc before this commit) contain an implementation of pipe2.

ChangeLog
include/unistd.h
libio/iopopen.c
posix/wordexp.c
socket/have_sock_cloexec.c
sysdeps/unix/sysv/linux/kernel-features.h

index 0a5e5691d94d5829783d96bc2e8c89e3c6027a7d..8ce9bea809e39921c991b3ec965fb2d61ce42721 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2017-04-18  Florian Weimer  <fweimer@redhat.com>
+
+       * include/unistd.h (__have_pipe2): Remove declaration.
+       * socket/have_sock_cloexec.c (__have_pipe2): Remove definition.
+       * libio/iopopen.c (_IO_new_proc_open): Assume that pipe2 is
+       available.
+       * posix/wordexp.c (exec_comm_child, exec_comm): Likewise.
+       * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_PIPE2):
+       Remove definition.
+
 2017-04-18  Florian Weimer  <fweimer@redhat.com>
 
        * malloc/malloc.c (cfree): Turn into compat symbol.
index 16d68a15056f7d7cb37ab8a3777bc76cb10f5ac7..e15fa0e23d6832383356625385ef8ba4494e7f0f 100644 (file)
@@ -171,7 +171,6 @@ extern int __libc_pause (void);
 /* Not cancelable variant.  */
 extern int __pause_nocancel (void) attribute_hidden;
 
-extern int __have_pipe2 attribute_hidden;
 extern int __have_dup3 attribute_hidden;
 
 extern int __getlogin_r_loginuid (char *name, size_t namesize)
index 08e29b44b04ade729047f2f0684d7898566730e9..95a12c90b516e5c3bb95b5c87fdaecf2ab8b4764 100644 (file)
@@ -140,29 +140,17 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode)
   if (_IO_file_is_open (fp))
     return NULL;
 
-#ifdef O_CLOEXEC
-# ifndef __ASSUME_PIPE2
-  if (__have_pipe2 >= 0)
-# endif
-    {
-      int r = __pipe2 (pipe_fds, O_CLOEXEC);
-# ifndef __ASSUME_PIPE2
-      if (__have_pipe2 == 0)
-       __have_pipe2 = r != -1 || errno != ENOSYS ? 1 : -1;
-
-      if (__have_pipe2 > 0)
-# endif
-       if (r < 0)
-         return NULL;
-    }
-#endif
-#ifndef __ASSUME_PIPE2
-# ifdef O_CLOEXEC
-  if (__have_pipe2 < 0)
-# endif
-    if (__pipe (pipe_fds) < 0)
-      return NULL;
-#endif
+  /* Atomically set the O_CLOEXEC flag for the pipe end used by the
+     child process (to avoid leaking the file descriptor in case of a
+     concurrent fork).  This is later reverted in the child process.
+     When popen returns, the parent pipe end can be O_CLOEXEC or not,
+     depending on the 'e' open mode, but there is only one flag which
+     controls both descriptors.  The parent end is adjusted below,
+     after creating the child process.  (In the child process, the
+     parent end should be closed on execve, so O_CLOEXEC remains set
+     there.)  */
+  if (__pipe2 (pipe_fds, O_CLOEXEC) < 0)
+    return NULL;
 
   if (do_read)
     {
@@ -183,27 +171,13 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode)
       int child_std_end = do_read ? 1 : 0;
       struct _IO_proc_file *p;
 
-#ifndef __ASSUME_PIPE2
-      /* If we have pipe2 the descriptor is marked for close-on-exec.  */
-      _IO_close (parent_end);
-#endif
       if (child_end != child_std_end)
-       {
-         _IO_dup2 (child_end, child_std_end);
-#ifndef __ASSUME_PIPE2
-         _IO_close (child_end);
-#endif
-       }
+       _IO_dup2 (child_end, child_std_end);
 #ifdef O_CLOEXEC
       else
-       {
-         /* The descriptor is already the one we will use.  But it must
-            not be marked close-on-exec.  Undo the effects.  */
-# ifndef __ASSUME_PIPE2
-         if (__have_pipe2 > 0)
-# endif
-           __fcntl (child_end, F_SETFD, 0);
-       }
+       /* The descriptor is already the one we will use.  But it must
+          not be marked close-on-exec.  Undo the effects.  */
+       __fcntl (child_end, F_SETFD, 0);
 #endif
       /* POSIX.2:  "popen() shall ensure that any streams from previous
          popen() calls that remain open in the parent process are closed
@@ -229,26 +203,10 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode)
       return NULL;
     }
 
-  if (do_cloexec)
-    {
-#ifndef __ASSUME_PIPE2
-# ifdef O_CLOEXEC
-      if (__have_pipe2 < 0)
-# endif
-       __fcntl (parent_end, F_SETFD, FD_CLOEXEC);
-#endif
-    }
-  else
-    {
-#ifdef O_CLOEXEC
-      /* Undo the effects of the pipe2 call which set the
-        close-on-exec flag.  */
-# ifndef __ASSUME_PIPE2
-      if (__have_pipe2 > 0)
-# endif
-       __fcntl (parent_end, F_SETFD, 0);
-#endif
-    }
+  if (!do_cloexec)
+    /* Undo the effects of the pipe2 call which set the
+       close-on-exec flag.  */
+    __fcntl (parent_end, F_SETFD, 0);
 
   _IO_fileno (fp) = parent_end;
 
index ba3f3ed4b66a65078418a123d1c683d6af531f9a..8567c9fc50120abe1b30b79cb201242f4420f3d3 100644 (file)
@@ -836,10 +836,7 @@ exec_comm_child (char *comm, int *fildes, int showerr, int noexec)
     {
 #ifdef O_CLOEXEC
       /* Reset the close-on-exec flag (if necessary).  */
-# ifndef __ASSUME_PIPE2
-      if (__have_pipe2 > 0)
-# endif
-       __fcntl (fildes[1], F_SETFD, 0);
+      __fcntl (fildes[1], F_SETFD, 0);
 #endif
     }
 
@@ -905,31 +902,8 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length,
   if (!comm || !*comm)
     return 0;
 
-#ifdef O_CLOEXEC
-# ifndef __ASSUME_PIPE2
-  if (__have_pipe2 >= 0)
-# endif
-    {
-      int r = __pipe2 (fildes, O_CLOEXEC);
-# ifndef __ASSUME_PIPE2
-      if (__have_pipe2 == 0)
-       __have_pipe2 = r != -1 || errno != ENOSYS ? 1 : -1;
-
-      if (__have_pipe2 > 0)
-# endif
-       if (r < 0)
-         /* Bad */
-         return WRDE_NOSPACE;
-    }
-#endif
-#ifndef __ASSUME_PIPE2
-# ifdef O_CLOEXEC
-  if (__have_pipe2 < 0)
-# endif
-    if (__pipe (fildes) < 0)
-      /* Bad */
-      return WRDE_NOSPACE;
-#endif
+  if (__pipe2 (fildes, O_CLOEXEC) < 0)
+    return WRDE_NOSPACE;
 
  again:
   if ((pid = __fork ()) < 0)
index 70c730ed120c54b9013349ad36e31f9ca7b044c6..579577d895791b3511edff99184ce08235b1c5ce 100644 (file)
 #include <sys/socket.h>
 #include <kernel-features.h>
 
-#if defined O_CLOEXEC && !defined __ASSUME_PIPE2
-int __have_pipe2;
-#endif
-
 #if defined O_CLOEXEC && !defined __ASSUME_DUP3
 int __have_dup3;
 #endif
index e6a2720e9479f4d9e4535f4efac86009bfa76168..233e302c0db34d1d59f1ac5a89660d430c35018f 100644 (file)
@@ -74,7 +74,6 @@
 /* Support for various CLOEXEC and NONBLOCK flags was added in
    2.6.27.  */
 #define __ASSUME_IN_NONBLOCK   1
-#define __ASSUME_PIPE2         1
 #define __ASSUME_DUP3          1
 
 /* Support for accept4 functionality was added in 2.6.28, but for some