From 8528b4ec004dd24b9c31107273f14a7fd19366a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Mon, 18 Dec 2017 13:26:29 +0100 Subject: [PATCH] Fix accidental resetting of O_NONBLOCK and set O_CLOEXEC on outgoing sockets, too. --- source/eventcore/drivers/posix/sockets.d | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/source/eventcore/drivers/posix/sockets.d b/source/eventcore/drivers/posix/sockets.d index bcb7f10..6197537 100644 --- a/source/eventcore/drivers/posix/sockets.d +++ b/source/eventcore/drivers/posix/sockets.d @@ -246,8 +246,7 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets } else { () @trusted { sockfd = accept(cast(sock_t)listenfd, () @trusted { return cast(sockaddr*)&addr; } (), &addr_len); } (); if (sockfd == -1) return; - setSocketNonBlocking(cast(SocketFD)sockfd); - setSocketCloseOnExec(cast(SocketFD)sockfd); + setSocketNonBlocking(cast(SocketFD)sockfd, true); } auto fd = cast(StreamSocketFD)sockfd; m_loop.initFD(fd, FDFlags.none); @@ -862,12 +861,12 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets { sock_t sock; version (linux) { - () @trusted { sock = socket(family, type | SOCK_NONBLOCK, 0); } (); + () @trusted { sock = socket(family, type | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); } (); if (sock == -1) return -1; } else { () @trusted { sock = socket(family, type, 0); } (); if (sock == -1) return -1; - setSocketNonBlocking(cast(SocketFD)sock); + setSocketNonBlocking(cast(SocketFD)sock, true); } return sock; } @@ -929,20 +928,15 @@ private void closeSocket(sock_t sockfd) else close(sockfd); } -private void setSocketNonBlocking(SocketFD sockfd) +private void setSocketNonBlocking(SocketFD sockfd, bool close_on_exec = false) @nogc nothrow { version (Windows) { uint enable = 1; () @trusted { ioctlsocket(sockfd, FIONBIO, &enable); } (); } else { - () @trusted { fcntl(cast(int)sockfd, F_SETFL, O_NONBLOCK, 1); } (); - } -} - -private void setSocketCloseOnExec(SocketFD sockfd) -@nogc nothrow { - version (Windows) {} else { - () @trusted { fcntl(cast(int)sockfd, F_SETFL, O_CLOEXEC, 1); } (); + int f = O_NONBLOCK; + if (close_on_exec) f |= O_CLOEXEC; + () @trusted { fcntl(cast(int)sockfd, F_SETFL, f); } (); } }