]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
*) mod_http2: clear the h2 worker slot connection early to avoid
authorStefan Eissing <icing@apache.org>
Thu, 21 Apr 2022 11:21:50 +0000 (11:21 +0000)
committerStefan Eissing <icing@apache.org>
Thu, 21 Apr 2022 11:21:50 +0000 (11:21 +0000)
     any race in slot updates after the connection has been handled.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1900104 13f79535-47bb-0310-9956-ffa450edef68

modules/http2/h2_workers.c

index ec0889d23498e1bfb32773ea9d1ae8e4f7c1a200..22c31f4f83bdaa4365b2b736fb6c71321043f2f6 100644 (file)
@@ -254,6 +254,7 @@ static void slot_done(h2_slot *slot)
 static void* APR_THREAD_FUNC slot_run(apr_thread_t *thread, void *wctx)
 {
     h2_slot *slot = wctx;
+    conn_rec *c;
     
     /* Get the next c2 from mplx to process. */
     while (get_next(slot)) {
@@ -287,13 +288,14 @@ static void* APR_THREAD_FUNC slot_run(apr_thread_t *thread, void *wctx)
          * configurations by mod_h2 alone.
          */
         AP_DEBUG_ASSERT(slot->connection != NULL);
-        slot->connection->id = (slot->connection->master->id << 8)^slot->id;
-        slot->connection->current_thread = thread;
+        c = slot->connection;
+        slot->connection = NULL;
+        c->id = (c->master->id << 8)^slot->id;
+        c->current_thread = thread;
 
-        ap_process_connection(slot->connection, ap_get_conn_socket(slot->connection));
+        ap_process_connection(c, ap_get_conn_socket(c));
 
-        h2_mplx_worker_c2_done(slot->connection);
-        slot->connection = NULL;
+        h2_mplx_worker_c2_done(c);
     }
 
     if (apr_atomic_read32(&slot->timed_out) == 0) {