Code

unpack_trees(): minor memory leak fix in unused destination index
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Mar 2008 21:48:40 +0000 (13:48 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 9 Mar 2008 09:03:45 +0000 (01:03 -0800)
This adds a "discard_index(&o->result)" to the failure path, to reclaim
memory from an in-core index we built but ended up not using.

The *big* memory leak comes from the fact that we leak the cache_entry
things left and right. That's a very traditional and deliberate leak:
because we used to build up the cache entries by just mapping them
directly in from the index file (and we emulate that in modern times
by allocating them from one big array), we can't actually free them
one-by-one.

So doing the "discard_index()" will free the hash tables etc, which is
good, and it will free the "istate->alloc" but that is never set on the
result because we don't get the result from the index read. So we don't
actually free the individual cache entries themselves that got created
from the trees.

That's not something new, btw. We never did. But some day we should just
add a flag to the cache_entry() that it's a "free one by one" kind, and
then we could/should do it. In the meantime, this one-liner will fix
*some* of the memory leaks, but not that old traditional one.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
unpack-trees.c

index 0cdf19817d65ef8b054b8399981be164c8ee7542..da68557b17650f7739ad12b9d5c94cca1a1f2d4f 100644 (file)
@@ -315,6 +315,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
 
 static int unpack_failed(struct unpack_trees_options *o, const char *message)
 {
+       discard_index(&o->result);
        if (!o->gently) {
                if (message)
                        return error(message);