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)


Reply via email to