From: Ruediger Pluem Date: Tue, 21 Sep 2021 20:03:52 +0000 (+0000) Subject: In case one of the pre_connection hooks causes the hook run to stop by an error X-Git-Tag: 2.5.0-alpha2-ci-test-only~797 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d9a8cd1f243d9f6df4481f5ec19ec0d96109654;p=thirdparty%2Fapache%2Fhttpd.git In case one of the pre_connection hooks causes the hook run to stop by an error 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 --- diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 349e56274ca..5b21e78d109 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -680,6 +680,7 @@ * 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" */ @@ -687,7 +688,7 @@ #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 diff --git a/include/http_connection.h b/include/http_connection.h index b49a2577c52..747a84af6e7 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -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 diff --git a/server/connection.c b/server/connection.c index a6dfef78583..f89ac553c60 100644 --- a/server/connection.c +++ b/server/connection.c @@ -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); diff --git a/server/core.c b/server/core.c index 4d777b9b8e0..67c36f8134d 100644 --- a/server/core.c +++ b/server/core.c @@ -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; diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c index bdaf93e2f71..eeb062b74d3 100644 --- a/server/mpm/event/event.c +++ b/server/mpm/event/event.c @@ -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; } /**