You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by br...@apache.org on 2005/10/30 23:55:37 UTC

svn commit: r329664 - in /httpd/httpd/trunk: modules/http/http_core.c server/eor_bucket.c

Author: brianp
Date: Sun Oct 30 14:55:35 2005
New Revision: 329664

URL: http://svn.apache.org/viewcvs?rev=329664&view=rev
Log:
Moved the extended_status scoreboard update from ap_process_http_connection
to the EOR bucket destructor.  Also, added some defensive code and comments
regarding r->pool lifetime to ap_process_http_connection.

Modified:
    httpd/httpd/trunk/modules/http/http_core.c
    httpd/httpd/trunk/server/eor_bucket.c

Modified: httpd/httpd/trunk/modules/http/http_core.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/modules/http/http_core.c?rev=329664&r1=329663&r2=329664&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http/http_core.c (original)
+++ httpd/httpd/trunk/modules/http/http_core.c Sun Oct 30 14:55:35 2005
@@ -125,11 +125,16 @@
             if (r->status == HTTP_OK) {
                 cs->state = CONN_STATE_HANDLER;
                 ap_process_async_request(r);
+                /* After the call to ap_process_request, the
+                 * request pool may have been deleted.  We set
+                 * r=NULL here to ensure that any dereference
+                 * of r that might be added later in this function
+                 * will result in a segfault immediately instead
+                 * of nondeterministic failures later.
+                 */
+                r = NULL;
             }
 
-            if (ap_extended_status)
-                ap_increment_counts(c->sbh, r);
-
             if (cs->state != CONN_STATE_WRITE_COMPLETION) {
                 /* Something went wrong; close the connection */
                 cs->state = CONN_STATE_LINGER;
@@ -164,15 +169,20 @@
         if (r->status == HTTP_OK) {
             cs->state = CONN_STATE_HANDLER;
             ap_process_request(r);
+            /* After the call to ap_process_request, the
+             * request pool will have been deleted.  We set
+             * r=NULL here to ensure that any dereference
+             * of r that might be added later in this function
+             * will result in a segfault immediately instead
+             * of nondeterministic failures later.
+             */
+            r = NULL;
         }
- 
-        if (ap_extended_status)
-            ap_increment_counts(c->sbh, r);
- 
+
         if (c->keepalive != AP_CONN_KEEPALIVE || c->aborted)
             break;
  
-        ap_update_child_status(c->sbh, SERVER_BUSY_KEEPALIVE, r);
+        ap_update_child_status(c->sbh, SERVER_BUSY_KEEPALIVE, NULL);
  
         if (ap_graceful_stop_signalled())
             break;

Modified: httpd/httpd/trunk/server/eor_bucket.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/server/eor_bucket.c?rev=329664&r1=329663&r2=329664&view=diff
==============================================================================
--- httpd/httpd/trunk/server/eor_bucket.c (original)
+++ httpd/httpd/trunk/server/eor_bucket.c Sun Oct 30 14:55:35 2005
@@ -17,6 +17,7 @@
 #include "httpd.h"
 #include "http_request.h"
 #include "http_protocol.h"
+#include "scoreboard.h"
 
 static apr_status_t eor_bucket_read(apr_bucket *b, const char **str, 
                                     apr_size_t *len, apr_read_type_e block)
@@ -52,6 +53,9 @@
     request_rec *r = (request_rec *)data;
     if (r != NULL) {
         ap_run_log_transaction(r);
+        if (ap_extended_status) {
+            ap_increment_counts(r->connection->sbh, r);
+        }
         apr_pool_destroy(r->pool);
     }
 }