From: Stefan Eissing Date: Wed, 22 Feb 2017 10:07:46 +0000 (+0000) Subject: On the 2.4.x branch: X-Git-Tag: 2.4.26~290 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3e485e9e9d78ef5379c30d09ab56e3fbd8df97b;p=thirdparty%2Fapache%2Fhttpd.git On the 2.4.x branch: merge of r1783683,1783693,1783756,1783759-1783760,1783762,1783912,1783996 from trunk git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1784001 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 90cbce1a964..77140268f97 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,11 @@ Changes with Apache 2.4.26 + *) mod_proxy_http2: support for ProxyPreserverHost directive. [Stefan Eissing] + + *) mod_http2: fix for crash when running out of memory. + [Robert Swiecki , Stefan Eissing] + *) mod_proxy_fcgi: Return HTTP 504 rather than 503 in case of proxy timeout. [Luca Toscano] diff --git a/modules/http2/h2_conn.c b/modules/http2/h2_conn.c index b13d47f83fb..0057c3ee6b9 100644 --- a/modules/http2/h2_conn.c +++ b/modules/http2/h2_conn.c @@ -26,6 +26,8 @@ #include #include +#include + #include "h2_private.h" #include "h2.h" #include "h2_config.h" @@ -253,6 +255,7 @@ apr_status_t h2_conn_pre_close(struct h2_ctx *ctx, conn_rec *c) conn_rec *h2_slave_create(conn_rec *master, int slave_id, apr_pool_t *parent) { apr_allocator_t *allocator; + apr_status_t status; apr_pool_t *pool; conn_rec *c; void *cfg; @@ -265,18 +268,27 @@ conn_rec *h2_slave_create(conn_rec *master, int slave_id, apr_pool_t *parent) /* We create a pool with its own allocator to be used for * processing a request. This is the only way to have the processing * independant of its parent pool in the sense that it can work in - * another thread. + * another thread. Also, the new allocator needs its own mutex to + * synchronize sub-pools. */ apr_allocator_create(&allocator); - apr_pool_create_ex(&pool, parent, NULL, allocator); - apr_pool_tag(pool, "h2_slave_conn"); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + status = apr_pool_create_ex(&pool, parent, NULL, allocator); + if (status != APR_SUCCESS) { + ap_log_cerror(APLOG_MARK, APLOG_ERR, status, master, + APLOGNO(10004) "h2_session(%ld-%d): create slave pool", + master->id, slave_id); + return NULL; + } apr_allocator_owner_set(allocator, pool); - + apr_pool_tag(pool, "h2_slave_conn"); + c = (conn_rec *) apr_palloc(pool, sizeof(conn_rec)); if (c == NULL) { ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOMEM, master, APLOGNO(02913) "h2_session(%ld-%d): create slave", master->id, slave_id); + apr_pool_destroy(pool); return NULL; } diff --git a/modules/http2/h2_conn_io.c b/modules/http2/h2_conn_io.c index 81cd65a4b09..a526d11286c 100644 --- a/modules/http2/h2_conn_io.c +++ b/modules/http2/h2_conn_io.c @@ -117,8 +117,8 @@ static void h2_conn_io_bb_log(conn_rec *c, int stream_id, int level, line = *buffer? buffer : "(empty)"; } /* Intentional no APLOGNO */ - ap_log_cerror(APLOG_MARK, level, 0, c, "h2_session(%s)-%s: %s", - c->log_id, tag, line); + ap_log_cerror(APLOG_MARK, level, 0, c, "h2_session(%ld)-%s: %s", + c->id, tag, line); } diff --git a/modules/http2/h2_mplx.c b/modules/http2/h2_mplx.c index 5f3a0d0635a..bbf8d596af2 100644 --- a/modules/http2/h2_mplx.c +++ b/modules/http2/h2_mplx.c @@ -27,6 +27,8 @@ #include #include +#include + #include "mod_http2.h" #include "h2.h" @@ -232,39 +234,56 @@ h2_mplx *h2_mplx_create(conn_rec *c, apr_pool_t *parent, h2_workers *workers) { apr_status_t status = APR_SUCCESS; - apr_allocator_t *allocator = NULL; + apr_allocator_t *allocator; + apr_thread_mutex_t *mutex; h2_mplx *m; ap_assert(conf); - status = apr_allocator_create(&allocator); - if (status != APR_SUCCESS) { - return NULL; - } - m = apr_pcalloc(parent, sizeof(h2_mplx)); if (m) { m->id = c->id; APR_RING_ELEM_INIT(m, link); m->c = c; + + /* We create a pool with its own allocator to be used for + * processing slave connections. This is the only way to have the + * processing independant of its parent pool in the sense that it + * can work in another thread. Also, the new allocator needs its own + * mutex to synchronize sub-pools. + */ + status = apr_allocator_create(&allocator); + if (status != APR_SUCCESS) { + return NULL; + } + apr_allocator_max_free_set(allocator, ap_max_mem_free); apr_pool_create_ex(&m->pool, parent, NULL, allocator); if (!m->pool) { + apr_allocator_destroy(allocator); return NULL; } apr_pool_tag(m->pool, "h2_mplx"); apr_allocator_owner_set(allocator, m->pool); - + status = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, + m->pool); + if (status != APR_SUCCESS) { + apr_pool_destroy(m->pool); + return NULL; + } + apr_allocator_mutex_set(allocator, mutex); + status = apr_thread_mutex_create(&m->lock, APR_THREAD_MUTEX_DEFAULT, m->pool); if (status != APR_SUCCESS) { + apr_pool_destroy(m->pool); return NULL; } status = apr_thread_cond_create(&m->task_thawed, m->pool); if (status != APR_SUCCESS) { + apr_pool_destroy(m->pool); return NULL; } - m->bucket_alloc = apr_bucket_alloc_create(m->pool); m->max_streams = h2_config_geti(conf, H2_CONF_MAX_STREAMS); m->stream_max_mem = h2_config_geti(conf, H2_CONF_STREAM_MAX_MEM); diff --git a/modules/http2/h2_mplx.h b/modules/http2/h2_mplx.h index defb3ecfe97..7ef9af59622 100644 --- a/modules/http2/h2_mplx.h +++ b/modules/http2/h2_mplx.h @@ -63,7 +63,6 @@ struct h2_mplx { long id; conn_rec *c; apr_pool_t *pool; - apr_bucket_alloc_t *bucket_alloc; APR_RING_ENTRY(h2_mplx) link; diff --git a/modules/http2/h2_proxy_session.c b/modules/http2/h2_proxy_session.c index 7d28699a373..49476e965b7 100644 --- a/modules/http2/h2_proxy_session.c +++ b/modules/http2/h2_proxy_session.c @@ -697,6 +697,7 @@ static apr_status_t open_stream(h2_proxy_session *session, const char *url, apr_uri_t puri; const char *authority, *scheme, *path; apr_status_t status; + proxy_dir_conf *dconf; stream = apr_pcalloc(r->pool, sizeof(*stream)); @@ -715,14 +716,22 @@ static apr_status_t open_stream(h2_proxy_session *session, const char *url, status = apr_uri_parse(stream->pool, url, &puri); if (status != APR_SUCCESS) return status; - + scheme = (strcmp(puri.scheme, "h2")? "http" : "https"); - authority = puri.hostname; - if (!ap_strchr_c(authority, ':') && puri.port - && apr_uri_port_of_scheme(scheme) != puri.port) { - /* port info missing and port is not default for scheme: append */ - authority = apr_psprintf(stream->pool, "%s:%d", authority, puri.port); + + dconf = ap_get_module_config(r->per_dir_config, &proxy_module); + if (dconf->preserve_host) { + authority = r->hostname; } + else { + authority = puri.hostname; + if (!ap_strchr_c(authority, ':') && puri.port + && apr_uri_port_of_scheme(scheme) != puri.port) { + /* port info missing and port is not default for scheme: append */ + authority = apr_psprintf(stream->pool, "%s:%d", authority, puri.port); + } + } + /* we need this for mapping relative uris in headers ("Link") back * to local uris */ stream->real_server_uri = apr_psprintf(stream->pool, "%s://%s", scheme, authority); diff --git a/modules/http2/h2_version.h b/modules/http2/h2_version.h index 9ab0ad5eb3a..dee64a3085c 100644 --- a/modules/http2/h2_version.h +++ b/modules/http2/h2_version.h @@ -26,7 +26,7 @@ * @macro * Version number of the http2 module as c string */ -#define MOD_HTTP2_VERSION "1.9.0-DEV" +#define MOD_HTTP2_VERSION "1.9.1" /** * @macro @@ -34,7 +34,7 @@ * release. This is a 24 bit number with 8 bits for major number, 8 bits * for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203. */ -#define MOD_HTTP2_VERSION_NUM 0x010900 +#define MOD_HTTP2_VERSION_NUM 0x010901 #endif /* mod_h2_h2_version_h */ diff --git a/modules/http2/mod_proxy_http2.c b/modules/http2/mod_proxy_http2.c index 1e2affabe1d..91f09ec83ac 100644 --- a/modules/http2/mod_proxy_http2.c +++ b/modules/http2/mod_proxy_http2.c @@ -591,6 +591,10 @@ run_connect: /* New conection: set a note on the connection what CN is * requested and what protocol we want */ if (ctx->p_conn->ssl_hostname) { + ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, ctx->owner, + "set SNI to %s for (%s)", + ctx->p_conn->ssl_hostname, + ctx->p_conn->hostname); apr_table_setn(ctx->p_conn->connection->notes, "proxy-request-hostname", ctx->p_conn->ssl_hostname); }