clear parsed flag when we free tree buffers
commit6e454b9a31840102807f1eee527ee717bf134102
authorJeff King <peff@peff.net>
Wed, 5 Jun 2013 22:37:39 +0000 (5 18:37 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Jun 2013 17:29:12 +0000 (6 10:29 -0700)
tree44920f41fae44ba48c914b5bc13f372c539e5469
parentedca4152560522a431a51fc0a06147fc680b5b18
clear parsed flag when we free tree buffers

Many code paths will free a tree object's buffer and set it
to NULL after finishing with it in order to keep memory
usage down during a traversal. However, out of 8 sites that
do this, only one actually unsets the "parsed" flag back.
Those sites that don't are setting a trap for later users of
the tree object; even after calling parse_tree, the buffer
will remain NULL, causing potential segfaults.

It is not known whether this is triggerable in the current
code. Most commands do not do an in-memory traversal
followed by actually using the objects again. However, it
does not hurt to be safe for future callers.

In most cases, we can abstract this out to a
"free_tree_buffer" helper. However, there are two
exceptions:

  1. The fsck code relies on the parsed flag to know that we
     were able to parse the object at one point. We can
     switch this to using a flag in the "flags" field.

  2. The index-pack code sets the buffer to NULL but does
     not free it (it is freed by a caller). We should still
     unset the parsed flag here, but we cannot use our
     helper, as we do not want to free the buffer.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fsck.c
builtin/index-pack.c
builtin/reflog.c
http-push.c
list-objects.c
reachable.c
revision.c
tree.c
tree.h
walker.c