From: Paul Querna Date: Sat, 22 Apr 2006 01:33:44 +0000 (+0000) Subject: Merge r394088 and r395180 from trunk. X-Git-Tag: 2.2.2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9deb5258cd05669de5eac2f5b225abd93ca71eaa;p=thirdparty%2Fapache%2Fhttpd.git Merge r394088 and r395180 from trunk. PR: 38793 Reviewed By: rpluem, jim, wrowe, trawick git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@396049 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 39ca737a0f0..09317de1851 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changes with Apache 2.2.2 *) mod_deflate: work correctly in an internal redirect [Brian J. France ] + *) mod_proxy: Do not release connections from connection pool twice. + PR 38793. [Ruediger Pluem, matthias ] + *) core: Prevent reading uninitialized memory while reading a line of protocol input. PR 39282. [Davi Arnaut ] diff --git a/STATUS b/STATUS index dde63e87409..8f4d8e84c94 100644 --- a/STATUS +++ b/STATUS @@ -75,17 +75,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy: Do not release connections from connection pool twice as this - can cause different threads to use the same connection at the - same time. PR 38793. - Trunk version of patch: - http://svn.apache.org/viewcvs?rev=394088&view=rev - 2.2.x version of patch: - Trunk version works - +1: rpluem, jim, wrowe (with trawick's observation), - trawick (with rev 395180) - trawick: needs http://svn.apache.org/viewcvs?rev=395180&view=rev - * mod_proxy_balancer: Initialize local data structures for workers of a balancer. PR 38227, PR 38267. Trunk version of patch: diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 8d2786878f8..41019802a90 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -109,6 +109,7 @@ * 20051115.0 (2.1.10-dev/2.2.0) add use_canonical_phys_port to core_dir_config * 20051115.1 (2.2.1) flush_packets and flush_wait members added to * proxy_server (minor) + * 20051115.2 (2.2.2) added inreslist member to proxy_conn_rec (minor) */ #define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */ @@ -116,7 +117,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20051115 #endif -#define MODULE_MAGIC_NUMBER_MINOR 1 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 2 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 6991b4d0675..57a7076b358 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -221,6 +221,9 @@ typedef struct { int close_on_recycle; /* Close the connection when returning to pool */ proxy_worker *worker; /* Connection pool this connection belogns to */ void *data; /* per scheme connection data */ +#if APR_HAS_THREADS + int inreslist; /* connection in apr_reslist? */ +#endif } proxy_conn_rec; typedef struct { diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index fa28451b7d5..cddd535b4dc 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -1230,7 +1230,6 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "proxy: error reading status line from remote " "server %s", backend->hostname); - ap_proxy_http_cleanup(NULL, r, backend); return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote server"); } @@ -1251,7 +1250,6 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, * if the status line was > 8192 bytes */ else if ((buffer[5] != '1') || (len >= sizeof(buffer)-1)) { - ap_proxy_http_cleanup(NULL, r, backend); return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_pstrcat(p, "Corrupt status line returned by remote " "server: ", buffer, NULL)); diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index d117c643e5a..fe0e91f4ab1 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1515,7 +1515,18 @@ static apr_status_t connection_cleanup(void *theconn) if (!worker->cp) return APR_SUCCESS; - /* deterimine if the connection need to be closed */ +#if APR_HAS_THREADS + /* Sanity check: Did we already return the pooled connection? */ + if (conn->inreslist) { + ap_log_perror(APLOG_MARK, APLOG_ERR, 0, conn->pool, + "proxy: Pooled connection 0x%pp for worker %s has been" + " already returned to the connection pool.", conn, + worker->name); + return APR_SUCCESS; + } +#endif + + /* determine if the connection need to be closed */ if (conn->close_on_recycle || conn->close) { apr_pool_t *p = conn->pool; apr_pool_clear(conn->pool); @@ -1525,6 +1536,7 @@ static apr_status_t connection_cleanup(void *theconn) } #if APR_HAS_THREADS if (worker->hmax && worker->cp->res) { + conn->inreslist = 1; apr_reslist_release(worker->cp->res, (void *)conn); } else @@ -1555,6 +1567,9 @@ static apr_status_t connection_constructor(void **resource, void *params, conn->pool = ctx; conn->worker = worker; +#if APR_HAS_THREADS + conn->inreslist = 1; +#endif *resource = conn; return APR_SUCCESS; @@ -1787,6 +1802,9 @@ PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function, (*conn)->worker = worker; (*conn)->close = 0; (*conn)->close_on_recycle = 0; +#if APR_HAS_THREADS + (*conn)->inreslist = 0; +#endif return OK; }