[PATCH 3/3] os/inputthread: Fix setting of cloexec on file descriptors

Jeremy Huddleston Sequoia jeremyhu at apple.com
Mon Sep 12 03:01:51 UTC 2016


O_CLOEXEC is not a file bit.  It is not setable with F_SETFL.  One must use it
when calling open(2).  To set it cloexec on an existing fd, F_SETFD and
FD_CLOEXEC must be used.

This also fixes a build failure regression on configurations that don't have
O_CLOEXEC defined.

cf: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
Regressed-in: 30ac7567980a1eb79d084a63e0e74e1d9a3af673
Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
---
 os/inputthread.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/os/inputthread.c b/os/inputthread.c
index 2ea39e7..6aa0a9c 100644
--- a/os/inputthread.c
+++ b/os/inputthread.c
@@ -385,6 +385,7 @@ void
 InputThreadPreInit(void)
 {
     int fds[2], hotplugPipe[2];
+    int flags;
 
     if (!InputThreadEnable)
         return;
@@ -408,13 +409,23 @@ InputThreadPreInit(void)
      * in parallel.
      */
     inputThreadInfo->readPipe = fds[0];
-    fcntl(inputThreadInfo->readPipe, F_SETFL, O_NONBLOCK | O_CLOEXEC);
+    fcntl(inputThreadInfo->readPipe, F_SETFL, O_NONBLOCK);
+    flags = fcntl(inputThreadInfo->readPipe, F_GETFD);
+    if (flags != -1) {
+        flags |= FD_CLOEXEC;
+        (void)fcntl(inputThreadInfo->readPipe, F_SETFD, &flags);
+    }
     SetNotifyFd(inputThreadInfo->readPipe, InputThreadNotifyPipe, X_NOTIFY_READ, NULL);
 
     inputThreadInfo->writePipe = fds[1];
 
     hotplugPipeRead = hotplugPipe[0];
-    fcntl(hotplugPipeRead, F_SETFL, O_NONBLOCK | O_CLOEXEC);
+    fcntl(hotplugPipeRead, F_SETFL, O_NONBLOCK);
+    flags = fcntl(hotplugPipeRead, F_GETFD);
+    if (flags != -1) {
+        flags |= FD_CLOEXEC;
+        (void)fcntl(hotplugPipeRead, F_SETFD, &flags);
+    }
     hotplugPipeWrite = hotplugPipe[1];
 
 #if defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)
-- 
2.10.0 (Apple Git-99)



More information about the xorg-devel mailing list