Author: rhuijben Date: Wed Oct 28 10:55:01 2015 New Revision: 1710989 URL: http://svn.apache.org/viewvc?rev=1710989&view=rev Log: Resolve a minor memory leak in the aggregate bucket's read_bucket implementation.
* buckets/aggregate_buckets.c (serf_bucket_aggregate_append_iovec): Resolve warning by commenting unused var. (serf_aggregate_read_bucket): Properly release item that contained the pointer to the released bucket. * test/test_buckets.c (test_aggregate_buckets): Extend test to test reading a bucket from the aggregate. Modified: serf/trunk/buckets/aggregate_buckets.c serf/trunk/test/test_buckets.c Modified: serf/trunk/buckets/aggregate_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/aggregate_buckets.c?rev=1710989&r1=1710988&r2=1710989&view=diff ============================================================================== --- serf/trunk/buckets/aggregate_buckets.c (original) +++ serf/trunk/buckets/aggregate_buckets.c Wed Oct 28 10:55:01 2015 @@ -227,7 +227,7 @@ void serf_bucket_aggregate_append_iovec( struct iovec *vecs, int vecs_count) { - aggregate_context_t *ctx = aggregate_bucket->data; + /* aggregate_context_t *ctx = aggregate_bucket->data; */ serf_bucket_t *new_bucket; new_bucket = serf_bucket_iovec_create(vecs, vecs_count, @@ -475,15 +475,21 @@ static serf_bucket_t * serf_aggregate_re { aggregate_context_t *ctx = bucket->data; serf_bucket_t *found_bucket; + bucket_list_t *list; if (!ctx->list) { return NULL; } - if (ctx->list->bucket->type == type) { + list = ctx->list; + if (list->bucket->type == type) { /* Got the bucket. Consume it from our list. */ - found_bucket = ctx->list->bucket; - ctx->list = ctx->list->next; + found_bucket = list->bucket; + ctx->list = list->next; + + /* And destroy the now unused item */ + serf_bucket_mem_free(bucket->allocator, list); + return found_bucket; } Modified: serf/trunk/test/test_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/test/test_buckets.c?rev=1710989&r1=1710988&r2=1710989&view=diff ============================================================================== --- serf/trunk/test/test_buckets.c (original) +++ serf/trunk/test/test_buckets.c Wed Oct 28 10:55:01 2015 @@ -674,6 +674,24 @@ static void test_aggregate_buckets(CuTes len > 0 && len <= strlen(BODY) ); CuAssert(tc, "Data should match first part of body.", strncmp(BODY, data, len) == 0); + + aggbkt = serf_bucket_aggregate_create(alloc); + + /* Put bkt in the aggregate */ + bkt = SERF_BUCKET_SIMPLE_STRING(BODY, alloc); + serf_bucket_aggregate_append(aggbkt, bkt); + + /* And now remove it */ + CuAssertPtrEquals(tc, bkt, + serf_bucket_read_bucket(aggbkt, + &serf_bucket_type_simple)); + /* Ok, then aggregate should be empty */ + read_and_check_bucket(tc, aggbkt, ""); + /* And can be destroyed */ + serf_bucket_destroy(aggbkt); + /* While it doesn't affect the inner bucket */ + read_and_check_bucket(tc, bkt, BODY); + serf_bucket_destroy(bkt); } static void test_aggregate_bucket_readline(CuTest *tc)