From 065eb6612492bacf4d7caaad90e35dafc2cbf7ea Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Sequoia Date: Sun, 11 Sep 2016 19:56:52 -0700 Subject: [PATCH] os/inputthread: Fix setting of cloexec on file descriptors 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 Reviewed-by: Julien Cristau --- os/inputthread.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/os/inputthread.c b/os/inputthread.c index 1cd1c2af4..6b379f5ea 100644 --- a/os/inputthread.c +++ b/os/inputthread.c @@ -379,6 +379,7 @@ void InputThreadPreInit(void) { int fds[2], hotplugPipe[2]; + int flags; if (!InputThreadEnable) return; @@ -402,13 +403,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]; }