You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2002/01/28 19:30:07 UTC

cvs commit: httpd-2.0/modules/generators mod_cgid.c

trawick     02/01/28 10:30:07

  Modified:    .        CHANGES
               modules/generators mod_cgid.c
  Log:
  Fix some unix socket descriptor leaks in the handler side of
  mod_cgid (the part that runs in the server process).  Whack a
  silly "close(-1)" in the handler too.
  
  Revision  Changes    Path
  1.542     +4 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.541
  retrieving revision 1.542
  diff -u -r1.541 -r1.542
  --- CHANGES	28 Jan 2002 00:41:30 -0000	1.541
  +++ CHANGES	28 Jan 2002 18:30:06 -0000	1.542
  @@ -1,5 +1,9 @@
   Changes with Apache 2.0.31-dev
   
  +  *) Fix some unix socket descriptor leaks in the handler side of
  +     mod_cgid (the part that runs in the server process).  Whack a
  +     silly "close(-1)" in the handler too.  [Jeff Trawick]
  +
     *) Change the pre_mpm hook to return a value, so that scoreboard
        init errors percolate up to code that knows how to exit 
        cleanly.  This required bump to the MMN.  [Jeff Trawick]
  
  
  
  1.111     +40 -10    httpd-2.0/modules/generators/mod_cgid.c
  
  Index: mod_cgid.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgid.c,v
  retrieving revision 1.110
  retrieving revision 1.111
  diff -u -r1.110 -r1.111
  --- mod_cgid.c	8 Jan 2002 06:26:09 -0000	1.110
  +++ mod_cgid.c	28 Jan 2002 18:30:07 -0000	1.111
  @@ -843,7 +843,12 @@
       return ret; 
   } 
   
  -
  +static apr_status_t close_unix_socket(void *thefd)
  +{
  +    int fd = (int)thefd;
  +    
  +    return close(fd);
  +}
   
   /**************************************************************** 
    * 
  @@ -926,7 +931,10 @@
       if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
               return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, errno, 
                                      "unable to create socket to cgi daemon");
  -    } 
  +    }
  +    apr_pool_cleanup_register(r->pool, (void *)sd, close_unix_socket,
  +                              apr_pool_cleanup_null);
  +    
       memset(&unix_addr, 0, sizeof(unix_addr));
       unix_addr.sun_family = AF_UNIX;
       strcpy(unix_addr.sun_path, conf->sockname);
  @@ -938,8 +946,10 @@
   
       send_req(sd, r, argv0, env, CGI_REQ); 
   
  -    /* We are putting the tempsock variable into a file so that we can use
  -     * a pipe bucket to send the data to the client.
  +    /* We are putting the socket discriptor into an apr_file_t so that we can
  +     * use a pipe bucket to send the data to the client.
  +     * Note that this does not register a cleanup for the socket.  We did
  +     * that explicitly right after we created the socket.
        */
       apr_os_file_put(&tempsock, &sd, 0, r->pool);
   
  @@ -1033,7 +1043,13 @@
               return HTTP_MOVED_TEMPORARILY; 
           } 
   
  -        if (!r->header_only) { 
  +        if (!r->header_only) {
  +            /* Passing our socket down the filter chain in a pipe bucket
  +             * gives up the responsibility of closing the socket, so
  +             * get rid of the cleanup.
  +             */
  +            apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket);
  +
               bb = apr_brigade_create(r->pool);
               b = apr_bucket_pipe_create(tempsock);
               APR_BRIGADE_INSERT_TAIL(bb, b);
  @@ -1044,6 +1060,12 @@
       } 
   
       if (nph) {
  +        /* Passing our socket down the filter chain in a pipe bucket
  +         * gives up the responsibility of closing the socket, so
  +         * get rid of the cleanup.
  +         */
  +        apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket);
  +
           bb = apr_brigade_create(r->pool);
           b = apr_bucket_pipe_create(tempsock);
           APR_BRIGADE_INSERT_TAIL(bb, b);
  @@ -1052,8 +1074,6 @@
           ap_pass_brigade(r->output_filters, bb);
       } 
   
  -    apr_file_close(tempsock);
  -
       return OK; /* NOT r->status, even if it has changed. */ 
   } 
   
  @@ -1188,7 +1208,9 @@
               return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, 0, 
                                      "unable to create socket to cgi daemon");
       }
  -
  +    apr_pool_cleanup_register(r->pool, (void *)sd, close_unix_socket,
  +                              apr_pool_cleanup_null);
  +    
       memset(&unix_addr, 0, sizeof(unix_addr));
       unix_addr.sun_family = AF_UNIX;
       strcpy(unix_addr.sun_path, conf->sockname);
  @@ -1205,8 +1227,10 @@
   
       send_req(sd, r, command, env, SSI_REQ); 
   
  -    /* We are putting the tempsock variable into a file so that we can use
  -     * a pipe bucket to send the data to the client.
  +    /* We are putting the socket discriptor into an apr_file_t so that we can
  +     * use a pipe bucket to send the data to the client.
  +     * Note that this does not register a cleanup for the socket.  We did
  +     * that explicitly right after we created the socket.
        */
       apr_os_file_put(&tempsock, &sd, 0, r->pool);
   
  @@ -1246,6 +1270,12 @@
       } 
   
       if (!r->header_only) { 
  +        /* Passing our socket down the filter chain in a pipe bucket
  +         * gives up the responsibility of closing the socket, so
  +         * get rid of the cleanup.
  +         */
  +        apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket);
  +
           bcgi = apr_brigade_create(r->pool);
           b    = apr_bucket_pipe_create(tempsock);
           APR_BRIGADE_INSERT_TAIL(bcgi, b);