From: Bill Stoddard Date: Fri, 13 Jul 2001 18:46:15 +0000 (+0000) Subject: Win32: Prevent listening sockets from being inherited by X-Git-Tag: 2.0.21~60 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1ad8da54656a57dc5dc5a55eafb3eced46f4b2b3;p=apache Win32: Prevent listening sockets from being inherited by the Apache child process, CGI scripts, rotatelog process etc. If the Apache child process segfaults, any processes that the child started are not reaped. Prior to this fix, these processes inherited the listening sockets which sometimes prevented the restarted Apache child process from accepting connections (ie, the server would hang). The Sleep(1000) is a bit of a hack but it is sufficient I believe. All that is really necessary is for the parent to give up its quantum and allow the child to run. I could not get WaitForInputIdle to work properly. Will investigate alternative solutions later. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89547 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 425c7341a8..f2fe09c35a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,14 @@ Changes with Apache 2.0.21-dev - + + *) Win32: Prevent listening sockets from being inherited by + the Apache child process, CGI scripts, rotatelog process + etc. If the Apache child process segfaults, any processes + that the child started are not reaped. Prior to this fix, + these processes inherited the listening sockets which sometimes + prevented the restarted Apache child process from accepting + connections (ie, the server would hang). + [Bill Stoddard] + *) Provide vhost and request strings when ExtendedStatus is on. [Greg Ames] diff --git a/server/mpm/winnt/mpm_winnt.c b/server/mpm/winnt/mpm_winnt.c index 19759df57e..e4b88c5748 100644 --- a/server/mpm/winnt/mpm_winnt.c +++ b/server/mpm/winnt/mpm_winnt.c @@ -75,7 +75,6 @@ #include "mpm_common.h" #include "scoreboard.h" - typedef HANDLE thread; #ifdef CONTAINING_RECORD #undef CONTAINING_RECORD @@ -1323,6 +1322,14 @@ static int create_process(apr_pool_t *p, HANDLE *handles, HANDLE *events, int *p ResumeThread(pi.hThread); CloseHandle(pi.hThread); + /* Important: + * Give the child process a chance to run before dup'ing the sockets. + * We have already set the listening sockets noninheritable, but if + * WSADuplicateSocket runs before the child process initializes + * the listeners will be inherited anyway. + */ + Sleep(1000); + /* Run the chain of open sockets. For each socket, duplicate it * for the target process then send the WSAPROTOCOL_INFO * (returned by dup socket) to the child.