summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbojan <bojan@13f79535-47bb-0310-9956-ffa450edef68>2009-02-20 00:51:58 +0000
committerbojan <bojan@13f79535-47bb-0310-9956-ffa450edef68>2009-02-20 00:51:58 +0000
commit8c242c96535ade1b9b52c570982d94f33bde4488 (patch)
tree6a606ae83540b92d60b1ee82e3ee6aa3bcad27f6
parentb059e2b3533f6e9ade4a39f0adfd11fde388ef6b (diff)
downloadlibapr-util-8c242c96535ade1b9b52c570982d94f33bde4488.tar.gz
Fix memcache memory leak with persistent connections.
Patch by Sami Tolvanen <sami.tolvanen mywot.com>. PR 46482. git-svn-id: http://svn.apache.org/repos/asf/apr/apr-util/trunk@746075 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--memcache/apr_memcache.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/memcache/apr_memcache.c b/memcache/apr_memcache.c
index b9100534..e74454af 100644
--- a/memcache/apr_memcache.c
+++ b/memcache/apr_memcache.c
@@ -25,8 +25,8 @@ struct apr_memcache_conn_t
char *buffer;
apr_size_t blen;
apr_pool_t *p;
+ apr_pool_t *tp;
apr_socket_t *sock;
- apr_bucket_alloc_t *balloc;
apr_bucket_brigade *bb;
apr_bucket_brigade *tb;
apr_memcache_server_t *ms;
@@ -224,12 +224,29 @@ APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server(apr_memcache_t *mc
static apr_status_t ms_find_conn(apr_memcache_server_t *ms, apr_memcache_conn_t **conn)
{
+ apr_status_t rv;
+ apr_bucket_alloc_t *balloc;
+ apr_bucket *e;
+
#if APR_HAS_THREADS
- return apr_reslist_acquire(ms->conns, (void **)conn);
+ rv = apr_reslist_acquire(ms->conns, (void **)conn);
#else
*conn = ms->conn;
- return APR_SUCCESS;
+ rv = APR_SUCCESS;
#endif
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ balloc = apr_bucket_alloc_create((*conn)->tp);
+ (*conn)->bb = apr_brigade_create((*conn)->tp, balloc);
+ (*conn)->tb = apr_brigade_create((*conn)->tp, balloc);
+
+ e = apr_bucket_socket_create((*conn)->sock, balloc);
+ APR_BRIGADE_INSERT_TAIL((*conn)->bb, e);
+
+ return rv;
}
static apr_status_t ms_bad_conn(apr_memcache_server_t *ms, apr_memcache_conn_t *conn)
@@ -243,6 +260,7 @@ static apr_status_t ms_bad_conn(apr_memcache_server_t *ms, apr_memcache_conn_t *
static apr_status_t ms_release_conn(apr_memcache_server_t *ms, apr_memcache_conn_t *conn)
{
+ apr_pool_clear(conn->tp);
#if APR_HAS_THREADS
return apr_reslist_release(ms->conns, conn);
#else
@@ -301,8 +319,8 @@ mc_conn_construct(void **conn_, void *params, apr_pool_t *pool)
{
apr_status_t rv = APR_SUCCESS;
apr_memcache_conn_t *conn;
- apr_bucket *e;
apr_pool_t *np;
+ apr_pool_t *tp;
apr_memcache_server_t *ms = params;
rv = apr_pool_create(&np, pool);
@@ -310,9 +328,16 @@ mc_conn_construct(void **conn_, void *params, apr_pool_t *pool)
return rv;
}
+ rv = apr_pool_create(&tp, np);
+ if (rv != APR_SUCCESS) {
+ apr_pool_destroy(np);
+ return rv;
+ }
+
conn = apr_palloc(np, sizeof( apr_memcache_conn_t ));
conn->p = np;
+ conn->tp = tp;
rv = apr_socket_create(&conn->sock, APR_INET, SOCK_STREAM, 0, np);
@@ -321,16 +346,10 @@ mc_conn_construct(void **conn_, void *params, apr_pool_t *pool)
return rv;
}
- conn->balloc = apr_bucket_alloc_create(conn->p);
- conn->bb = apr_brigade_create(conn->p, conn->balloc);
- conn->tb = apr_brigade_create(conn->p, conn->balloc);
conn->buffer = apr_palloc(conn->p, BUFFER_SIZE);
conn->blen = 0;
conn->ms = ms;
- e = apr_bucket_socket_create(conn->sock, conn->balloc);
- APR_BRIGADE_INSERT_TAIL(conn->bb, e);
-
rv = conn_connect(conn);
if (rv != APR_SUCCESS) {
apr_pool_destroy(np);