]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
In case one of the pre_connection hooks causes the hook run to stop by an error
authorRuediger Pluem <rpluem@apache.org>
Tue, 21 Sep 2021 20:03:52 +0000 (20:03 +0000)
committerRuediger Pluem <rpluem@apache.org>
Tue, 21 Sep 2021 20:03:52 +0000 (20:03 +0000)
the pre_connection hook of the core module maybe did not run
(it is APR_HOOK_REALLY_LAST) and hence we missed to

- Put the socket in c->conn_config
- Setup core output and input filters
- Set socket options and timeouts

For calls of ap_run_pre_connection where this matters create a wrapper named
ap_pre_connection that ensures that this happens.

* include/ap_mmn.h: Bump minor version as we added new ap_pre_connection
  function.

* include/http_connection.h: Declare ap_pre_connection prototype.

* server/connection.c: Make use of ap_pre_connection in ap_process_connection.

* server/core.c: Implement ap_pre_connection.

* server/mpm/event/event.c: Make use of ap_pre_connection.

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

include/ap_mmn.h
include/http_connection.h
server/connection.c
server/core.c
server/mpm/event/event.c

index 349e56274ca07e12fe784b3418580468ee1f0348..5b21e78d109d2a9281128841c270a8d24a8add64 100644 (file)
  * 20210531.3 (2.5.1-dev)  Add hook child_stopping to get informed that a child
  *                         is being shut down.
  * 20210531.4 (2.5.1-dev)  Add ap_create_connection
+ * 20210531.5 (2.5.1-dev)  Add ap_pre_connection
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20210531
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 4             /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 5             /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index b49a2577c527f25a2f4cd55940271f462e831bd1..747a84af6e72c8d18c16874046cacaaf83064cf6 100644 (file)
@@ -135,6 +135,21 @@ AP_DECLARE_HOOK(int,process_connection,(conn_rec *c))
  */
 AP_DECLARE_HOOK(int,pre_close_connection,(conn_rec *c))
 
+/**
+ * This is a wrapper around ap_run_pre_connection. In case that
+ * ap_run_pre_connection returns an error it marks the connection as
+ * aborted and ensures that the basic connection setup normally done
+ * by the core module is done in case it was not done so far.
+ * @param c The connection on which the request has been received.
+ *          Same as for the pre_connection hook.
+ * @param csd The mechanism on which this connection is to be read.
+ *            Most times this will be a socket, but it is up to the module
+ *            that accepts the request to determine the exact type.
+ *            Same as for the pre_connection hook.
+ * @return The result of ap_run_pre_connection
+ */
+AP_DECLARE(int) ap_pre_connection(conn_rec *c, void *csd);
+
 /**
  * Create a new server/incoming or client/outgoing/proxy connection
  * @param p The pool from which to allocate the connection record
index a6dfef7858376dad521b795efebf16a66bebc154..f89ac553c60644d64eb6cd8c969d9b64319e69c5 100644 (file)
@@ -225,13 +225,9 @@ AP_DECLARE(void) ap_lingering_close(conn_rec *c)
 
 AP_CORE_DECLARE(void) ap_process_connection(conn_rec *c, void *csd)
 {
-    int rc;
     ap_update_vhost_given_ip(c);
 
-    rc = ap_run_pre_connection(c, csd);
-    if (rc != OK && rc != DONE) {
-        c->aborted = 1;
-    }
+    ap_pre_connection(c, csd);
 
     if (!c->aborted) {
         ap_run_process_connection(c);
index 4d777b9b8e02a4853084f0a321fb24d8be85b747..67c36f8134d26c0d0223bce6628c1138fdf11fd8 100644 (file)
@@ -5557,6 +5557,31 @@ static int core_pre_connection(conn_rec *c, void *csd)
     return DONE;
 }
 
+AP_DECLARE(int) ap_pre_connection(conn_rec *c, void *csd)
+{
+    int rc = OK;
+
+    rc = ap_run_pre_connection(c, csd);
+    if (rc != OK && rc != DONE) {
+        c->aborted = 1;
+        /*
+         * In case we errored, the pre_connection hook of the core
+         * module maybe did not run (it is APR_HOOK_REALLY_LAST) and
+         * hence we missed to
+         *
+         * - Put the socket in c->conn_config
+         * - Setup core output and input filters
+         * - Set socket options and timeouts
+         *
+         * Hence call it in this case.
+         */
+        if (!ap_get_conn_socket(c)) {
+            core_pre_connection(c, csd);
+        }
+    }
+    return rc;
+}
+
 AP_CORE_DECLARE(conn_rec *) ap_create_slave_connection(conn_rec *c)
 {
     apr_pool_t *pool;
index bdaf93e2f711393bf40d99c2aab47580d748561d..eeb062b74d3fd26394b61fbae5fdf19a324eab34 100644 (file)
@@ -1037,11 +1037,10 @@ static void process_socket(apr_thread_t *thd, apr_pool_t * p, apr_socket_t * soc
 
         ap_update_vhost_given_ip(c);
 
-        rc = ap_run_pre_connection(c, sock);
+        rc = ap_pre_connection(c, sock);
         if (rc != OK && rc != DONE) {
             ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, APLOGNO(00469)
                           "process_socket: connection aborted");
-            c->aborted = 1;
         }
 
         /**