reflog-walk: don't free reflogs added to cache
authorJeff King <peff@peff.net>
Fri, 7 Jul 2017 08:41:49 +0000 (04:41 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Jul 2017 16:00:31 +0000 (09:00 -0700)
commit8aae3cf7558f00cf3c05636f888cb11e5e548e51
treefdb34e2eeb8010b9eb91784bdbddec0ff49b2113
parent75afe7ac8728128873c001d82b02ada4a3aa8181
reflog-walk: don't free reflogs added to cache

The add_reflog_for_walk() function keeps a cache mapping
refnames to their reflog contents. We use a cached reflog
entry if available, and otherwise allocate and store a new
one.

Since 5026b47175 (add_reflog_for_walk: avoid memory leak,
2017-05-04), when we hit an error parsing a date-based
reflog spec, we free the reflog memory but leave the cache
entry pointing to the now-freed memory.

We can fix this by just leaving the memory intact once it
has made it into the cache. This may leave an unused entry
in the cache, but that's OK. And it means we also catch a
similar situation: we may not have allocated at all in this
invocation, but simply be pointing to a cached entry from a
previous invocation (which is relying on that entry being
present).

The new test in t1411 exercises this case and fails when run
with --valgrind or ASan.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reflog-walk.c
t/t1411-reflog-show.sh