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)