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)