Commit f0d05926 authored by Bill Stoddard's avatar Bill Stoddard
Browse files

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
parent 06a9110f
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
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]

+8 −1
Original line number Diff line number Diff line
@@ -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.