memory leak in free()
Jason Evans
jasone at FreeBSD.org
Tue Jun 20 17:51:25 UTC 2006
Ville-Pertti Keinonen wrote:
>
> On Jun 14, 2006, at 8:35 PM, Jason Evans wrote:
>
>> Incidentally, this isn't an issue on 64-bit systems, since only mmap
>> () is used to request memory from the kernel.
>
>
> The test does seem to leak memory on 64-bit systems, though; not the
> actual allocated bits, but support structures, namely nodes that
> chunk_dealloc tries to insert into old_chunks but fails because a node
> holding that address is already there.
>
> It should be possible to fix this either by removing any nodes within
> range from old_chunks when allocating "new" memory, or by checking the
> return value of RB_INSERT in chunk_dealloc, and deallocating the new
> node if it returns non-NULL.
>
> A patch implementing the latter that seems to work:
>
> --- malloc.c 10 May 2006 00:07:45 -0000 1.126
> +++ malloc.c 19 Jun 2006 13:58:57 -0000
> @@ -1370,7 +1370,8 @@
> node->chunk = (void *)((uintptr_t)chunk + (uintptr_t)
> offset);
> node->size = chunk_size;
> - RB_INSERT(chunk_tree_s, &old_chunks, node);
> + if (RB_INSERT(chunk_tree_s, &old_chunks, node) != NULL)
> + base_chunk_node_dealloc(node);
> }
> #ifdef USE_BRK
Ah, you are right that there is a leak. I'm going to use a slightly
different approach to fixing the problem, but thank you very much for
pointing it out.
Jason
More information about the freebsd-current
mailing list