You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@apache.org on 2001/07/13 14:45:29 UTC

cvs commit: httpd-2.0/server/mpm/winnt mpm_winnt.c

stoddard    01/07/13 05:45:28

  Modified:    server/mpm/winnt mpm_winnt.c
  Log:
  Win32: First of two patches to prevent child processes from inheriting open
  socket descriptors.
  
  Revision  Changes    Path
  1.161     +34 -10    httpd-2.0/server/mpm/winnt/mpm_winnt.c
  
  Index: mpm_winnt.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/mpm_winnt.c,v
  retrieving revision 1.160
  retrieving revision 1.161
  diff -u -r1.160 -r1.161
  --- mpm_winnt.c	2001/06/27 17:43:51	1.160
  +++ mpm_winnt.c	2001/07/13 12:45:19	1.161
  @@ -428,9 +428,7 @@
           apr_os_sock_put(&lr->sd, &nsd, pconf);
           num_listeners++;
       }
  -
       CloseHandle(pipe);
  -
       return num_listeners;
   }
   
  @@ -1324,7 +1322,7 @@
       /* We never store the thread's handle, so close it now. */
       ResumeThread(pi.hThread);
       CloseHandle(pi.hThread);
  - 
  +
       /* 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.
  @@ -1517,7 +1515,33 @@
       return 1;      /* Tell the caller we want a restart */
   }
   
  +/* set_listeners_noninheritable()
  + * Make the listening socket handles noninheritable by processes
  + * started out of this process.
  + */
  +static int set_listeners_noninheritable(apr_pool_t *p) 
  +{
  +    ap_listen_rec *lr;
  +    HANDLE dup;
  +    SOCKET nsd;
  +    HANDLE hProcess = GetCurrentProcess();
   
  +    for (lr = ap_listeners; lr; lr = lr->next) {
  +        apr_os_sock_get(&nsd,lr->sd);
  +        if (!DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup, 0,
  +                             FALSE,     /* Inherit flag */
  +                             DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
  +            ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), 
  +                         server_conf,
  +                         "set_listeners_noninheritable: DuplicateHandle failed.");
  +            return 0;
  +        }
  +        nsd = (SOCKET) dup;
  +        apr_os_sock_put(&lr->sd, &nsd, p);
  +    }
  +    return 1;
  +}
  +
   /* service_nt_main_fn needs to append the StartService() args 
    * outside of our call stack and thread as the service starts...
    */
  @@ -1945,11 +1969,8 @@
           ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, server_conf,
                        "Child %d: Child process is running", my_pid);
   
  -        /* Set up the scoreboard. The scoreboard in this MPM only applies to the
  -         * child process and is not shared across processes
  -         */
  +        /* Set up the scoreboard. */
           ap_create_scoreboard(pconf, SB_NOT_SHARED);
  -
           if (one_process) {
               if (ap_setup_listeners(server_conf) < 1) {
                   return 1;
  @@ -1958,12 +1979,13 @@
           else {
               get_listeners_from_parent(server_conf);
           }
  -
  +        if (!set_listeners_noninheritable(pconf)) {
  +            return 1;
  +        }
           child_main();
   
           ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, server_conf,
                        "Child %d: Child process is exiting", my_pid);        
  -
           return 1;
       }
       else { 
  @@ -1973,7 +1995,9 @@
                            "no listening sockets available, shutting down");
               return 1;
           }
  -
  +        if (!set_listeners_noninheritable(pconf)) {
  +            return 1;
  +        }
           restart = master_main(server_conf, shutdown_event, restart_event);
   
           if (!restart) {