*) mod_deflate: work correctly in an internal redirect
[Brian J. France <list firehawksystems com>]
+ *) mod_proxy: Do not release connections from connection pool twice.
+ PR 38793. [Ruediger Pluem, matthias <mk-asf gigacodes.de>]
+
*) core: Prevent reading uninitialized memory while reading a line of
protocol input. PR 39282. [Davi Arnaut <davi haxent.com.br>]
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:
* 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" */
#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
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 {
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");
}
* 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));
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);
}
#if APR_HAS_THREADS
if (worker->hmax && worker->cp->res) {
+ conn->inreslist = 1;
apr_reslist_release(worker->cp->res, (void *)conn);
}
else
conn->pool = ctx;
conn->worker = worker;
+#if APR_HAS_THREADS
+ conn->inreslist = 1;
+#endif
*resource = conn;
return APR_SUCCESS;
(*conn)->worker = worker;
(*conn)->close = 0;
(*conn)->close_on_recycle = 0;
+#if APR_HAS_THREADS
+ (*conn)->inreslist = 0;
+#endif
return OK;
}