From: Vsevolod Stakhov Date: Mon, 18 Jan 2016 14:05:45 +0000 (+0000) Subject: Fix an awful memory leak X-Git-Tag: 1.1.0~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b73911035838aa271ae7bc88632f96c90ca7f2ee;p=thirdparty%2Frspamd.git Fix an awful memory leak --- diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c index 20050987ed..ee78b41e81 100644 --- a/src/libutil/mem_pool.c +++ b/src/libutil/mem_pool.c @@ -120,8 +120,9 @@ rspamd_mempool_chain_new (gsize size, enum rspamd_mempool_chain_type pool_type) g_atomic_int_add (&mem_pool_stat->bytes_allocated, size); } else { - chain = g_slice_alloc (sizeof (struct _pool_chain)); - chain->begin = g_slice_alloc (size); + map = g_slice_alloc (sizeof (struct _pool_chain) + size); + chain = map; + chain->begin = ((guint8 *) chain) + sizeof (struct _pool_chain); g_atomic_int_add (&mem_pool_stat->bytes_allocated, size); g_atomic_int_inc (&mem_pool_stat->chunks_allocated); } @@ -515,6 +516,7 @@ rspamd_mempool_delete (rspamd_mempool_t * pool) struct _pool_destructors *destructor; gpointer ptr; guint i, j; + gsize len; POOL_MTX_LOCK (); @@ -533,13 +535,17 @@ rspamd_mempool_delete (rspamd_mempool_t * pool) if (pool->pools[i]) { for (j = 0; j < pool->pools[i]->len; j++) { cur = g_ptr_array_index (pool->pools[i], j); + g_atomic_int_add (&mem_pool_stat->bytes_allocated, + -((gint)cur->len)); + g_atomic_int_add (&mem_pool_stat->chunks_allocated, -1); + + len = cur->len + sizeof (struct _pool_chain); if (i == RSPAMD_MEMPOOL_SHARED) { - munmap ((void *)cur, cur->len + - sizeof (struct _pool_chain)); + munmap ((void *)cur, len); } else { - g_slice_free1 (sizeof (*cur), cur); + g_slice_free1 (len, cur); } } @@ -570,13 +576,19 @@ rspamd_mempool_cleanup_tmp (rspamd_mempool_t * pool) { struct _pool_chain *cur; guint i; + gsize len; POOL_MTX_LOCK (); if (pool->pools[RSPAMD_MEMPOOL_TMP]) { for (i = 0; i < pool->pools[RSPAMD_MEMPOOL_TMP]->len; i++) { cur = g_ptr_array_index (pool->pools[RSPAMD_MEMPOOL_TMP], i); - g_slice_free1 (sizeof (*cur), cur); + g_atomic_int_add (&mem_pool_stat->bytes_allocated, + -((gint)cur->len)); + g_atomic_int_add (&mem_pool_stat->chunks_allocated, -1); + len = cur->len + sizeof (struct _pool_chain); + + g_slice_free1 (len, cur); } g_ptr_array_free (pool->pools[RSPAMD_MEMPOOL_TMP], TRUE);