diff options
| author | shishir gowda <shishirng@gluster.com> | 2010-09-14 01:27:22 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-09-14 00:47:23 -0700 | 
| commit | 8a2d1cf7a1425b9de2622635a1149f460bf1f36b (patch) | |
| tree | 15751c57f00f6d68ef748b1e68b9faa3b110c5e3 | |
| parent | b0003a7e789e0618656dd4214195578f53d1e84e (diff) | |
Add checks in mem_pool to catch possible double frees
Signed-off-by: shishir gowda <shishirng@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1520 (gnfs crashes on start-up in mem_get0)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1520
| -rw-r--r-- | libglusterfs/src/mem-pool.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c index aec1d909dde..d11bcbcae7c 100644 --- a/libglusterfs/src/mem-pool.c +++ b/libglusterfs/src/mem-pool.c @@ -23,10 +23,11 @@  #include <stdlib.h>  #include <stdarg.h> - -#define GF_MEM_POOL_PAD_BOUNDARY         (sizeof(struct list_head)) +#define GF_MEM_POOL_LIST_BOUNDARY        (sizeof(struct list_head)) +#define GF_MEM_POOL_PAD_BOUNDARY         (GF_MEM_POOL_LIST_BOUNDARY + sizeof(int))  #define mem_pool_chunkhead2ptr(head)     ((head) + GF_MEM_POOL_PAD_BOUNDARY)  #define mem_pool_ptr2chunkhead(ptr)      ((ptr) - GF_MEM_POOL_PAD_BOUNDARY) +#define is_mem_chunk_in_use(ptr)         (*ptr == 1)  #define GF_MEM_HEADER_SIZE  (4 + sizeof (size_t) + sizeof (xlator_t *) + 4)  #define GF_MEM_TRAILER_SIZE 4 @@ -342,6 +343,7 @@ mem_get0 (struct mem_pool *mem_pool)  {          struct list_head *list = NULL;          void             *ptr = NULL; +        int              *in_use = NULL;          if (!mem_pool) {                  gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument"); @@ -358,6 +360,9 @@ mem_get0 (struct mem_pool *mem_pool)                          mem_pool->cold_count--;                          ptr = list; +                        in_use = (ptr + GF_MEM_POOL_LIST_BOUNDARY); +                        *in_use = 1; +                          goto fwd_addr_out;                  }                  ptr = MALLOC (mem_pool->real_sizeof_type); @@ -378,6 +383,7 @@ mem_get (struct mem_pool *mem_pool)  {  	struct list_head *list = NULL;  	void             *ptr = NULL; +        int             *in_use = NULL;  	if (!mem_pool) {  		gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument"); @@ -394,6 +400,9 @@ mem_get (struct mem_pool *mem_pool)  			mem_pool->cold_count--;  			ptr = list; +                        in_use = (ptr + GF_MEM_POOL_LIST_BOUNDARY); +                        *in_use = 1; +                          goto fwd_addr_out;  		} @@ -457,6 +466,8 @@ void  mem_put (struct mem_pool *pool, void *ptr)  {  	struct list_head *list = NULL; +	int    *in_use = NULL; +	void   *head = NULL;  	if (!pool || !ptr) {  		gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument"); @@ -469,9 +480,12 @@ mem_put (struct mem_pool *pool, void *ptr)  		switch (__is_member (pool, ptr))  		{  		case 1: -	                list = mem_pool_ptr2chunkhead (ptr); +	                list = head = mem_pool_ptr2chunkhead (ptr); +			in_use = (head + GF_MEM_POOL_LIST_BOUNDARY); +			GF_ASSERT (is_mem_chunk_in_use(in_use));  		        pool->hot_count--;  			pool->cold_count++; +			*in_use = 0;  			list_add (list, &pool->list);  			break;  		case -1:  | 
