leak_pending: use object_array_clear(), not free()

Setting `leak_pending = 1` tells `prepare_revision_walk()` not to
release the `pending` array, and makes that the caller's responsibility.
See 4a43d374f (revision: add leak_pending flag, 2011-10-01) and
353f5657a (bisect: use leak_pending flag, 2011-10-01).

Commit 1da1e07c8 (clean up name allocation in prepare_revision_walk,
2014-10-15) fixed a memory leak in `prepare_revision_walk()` by
switching from `free()` to `object_array_clear()`. However, where we use
the `leak_pending`-mechanism, we're still only calling `free()`.

Use `object_array_clear()` instead. Copy some helpful comments from
353f5657a to the other callers that we update to clarify the memory
responsibilities, and to highlight that the commits are not affected
when we clear the array -- it is indeed correct to both tidy up the
commit flags and clear the object array.

Document `leak_pending` in revision.h to help future users get this
right.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Martin Ågren
2017-09-23 01:34:51 +02:00
committed by Junio C Hamano
parent cb7b29eb67
commit b2ccdf7fc1
4 changed files with 29 additions and 3 deletions

View File

@ -157,9 +157,14 @@ int verify_bundle(struct bundle_header *header, int verbose)
req_nr = revs.pending.nr;
setup_revisions(2, argv, &revs, NULL);
/* Save pending objects, so they can be cleaned up later. */
refs = revs.pending;
revs.leak_pending = 1;
/*
* prepare_revision_walk (together with .leak_pending = 1) makes us
* the sole owner of the list of pending objects.
*/
if (prepare_revision_walk(&revs))
die(_("revision walk setup failed"));
@ -176,8 +181,10 @@ int verify_bundle(struct bundle_header *header, int verbose)
refs.objects[i].name);
}
/* Clean up objects used, as they will be reused. */
clear_commit_marks_for_object_array(&refs, ALL_REV_FLAGS);
free(refs.objects);
object_array_clear(&refs);
if (verbose) {
struct ref_list *r;