Author: ivan
Date: Thu Nov 5 07:09:20 2015
New Revision: 1712716
URL: http://svn.apache.org/viewvc?rev=1712716&view=rev
Log:
Resolve small memory leak in serf__bucket_headers_remove().
* buckets/headers_buckets.c
(serf__bucket_headers_remove): Free data occupied by removed header entry.
* test/test_internal.c
(test_header_buckets_remove): Use test__create_bucket_allocator() to create
bucket allocator for better diagnostic and destroy tested buckets once
we finished testing them.
Modified:
serf/trunk/buckets/headers_buckets.c
serf/trunk/test/test_internal.c
Modified: serf/trunk/buckets/headers_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/headers_buckets.c?rev=1712716&r1=1712715&r2=1712716&view=diff
==============================================================================
--- serf/trunk/buckets/headers_buckets.c (original)
+++ serf/trunk/buckets/headers_buckets.c Thu Nov 5 07:09:20 2015
@@ -210,19 +210,26 @@ void serf__bucket_headers_remove(serf_bu
/* Find and delete all items with the same header (case insensitive) */
while (scan) {
+ header_list_t *next_hdr = scan->next;
if (strcasecmp(scan->header, header) == 0) {
if (prev) {
- prev->next = scan->next;
+ prev->next = next_hdr;
} else {
- ctx->list = scan->next;
+ ctx->list = next_hdr;
}
if (ctx->last == scan) {
ctx->last = NULL;
}
+
+ if (scan->alloc_flags & ALLOC_HEADER)
+ serf_bucket_mem_free(bucket->allocator, (void *)scan->header);
+ if (scan->alloc_flags & ALLOC_VALUE)
+ serf_bucket_mem_free(bucket->allocator, (void *)scan->value);
+ serf_bucket_mem_free(bucket->allocator, scan);
} else {
prev = scan;
}
- scan = scan->next;
+ scan = next_hdr;
}
}
Modified: serf/trunk/test/test_internal.c
URL:
http://svn.apache.org/viewvc/serf/trunk/test/test_internal.c?rev=1712716&r1=1712715&r2=1712716&view=diff
==============================================================================
--- serf/trunk/test/test_internal.c (original)
+++ serf/trunk/test/test_internal.c Thu Nov 5 07:09:20 2015
@@ -323,8 +323,7 @@ static void test_config_store_remove_obj
static void test_header_buckets_remove(CuTest *tc)
{
test_baton_t *tb = tc->testBaton;
- serf_bucket_alloc_t *alloc = serf_bucket_allocator_create(tb->pool, NULL,
- NULL);
+ serf_bucket_alloc_t *alloc = test__create_bucket_allocator(tc, tb->pool);
const char *cur;
serf_bucket_t *hdrs = serf_bucket_headers_create(alloc);
@@ -393,6 +392,7 @@ static void test_header_buckets_remove(C
cur = "Content-Type: text/plain" CRLF
"Content-Length: 100" CRLF CRLF;
read_and_check_bucket(tc, hdrs, cur);
+ serf_bucket_destroy(hdrs);
}
static void test_runtime_versions(CuTest *tc)