A hashfile_checkpoint struct is basically just a copy of the hash_ctx
state at a given point in the file. As such, it contains its own
git_hash_ctx which may (depending on the underlying hash implementation)
need to be discarded when we're done with it.
Let's add a "release" function which cleans up the hash context it
holds. I chose "release" here and not "discard" because you'd use this
to clean up every checkpoint, whether you used it or not. As opposed to
git_hash_discard(), which is needed only if you didn't call
git_hash_final().
There are only two callers which use hashfile_checkpoints, and we can
add release calls to both. When built with "SANITIZE=leak
OPENSSL_SHA1_UNSAFE=1", this makes both t1050 and t9300 leak-free.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
out:
free(in_buf);
free(out_buf);
+ hashfile_checkpoint_release(&checkpoint);
}
/* All calls must be guarded by find_object() or find_mark() to
return 0;
}
+void hashfile_checkpoint_release(struct hashfile_checkpoint *checkpoint)
+{
+ git_hash_discard(&checkpoint->ctx);
+}
+
void crc32_begin(struct hashfile *f)
{
f->crc32 = crc32(0, NULL, 0);
void hashfile_checkpoint_init(struct hashfile *, struct hashfile_checkpoint *);
void hashfile_checkpoint(struct hashfile *, struct hashfile_checkpoint *);
int hashfile_truncate(struct hashfile *, struct hashfile_checkpoint *);
+void hashfile_checkpoint_release(struct hashfile_checkpoint *);
/* finalize_hashfile flags */
#define CSUM_CLOSE 1
state->alloc_written);
state->written[state->nr_written++] = idx;
}
+
+ hashfile_checkpoint_release(&checkpoint);
return 0;
}