mirror of
https://github.com/git/git.git
synced 2026-08-07 00:22:05 +00:00
csum-file: provide a function to release checkpoints
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>
This commit is contained in:
committed by
Junio C Hamano
parent
64337aecde
commit
46ba44e1fd
@@ -1214,6 +1214,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
|
||||
out:
|
||||
free(in_buf);
|
||||
free(out_buf);
|
||||
hashfile_checkpoint_release(&checkpoint);
|
||||
}
|
||||
|
||||
/* All calls must be guarded by find_object() or find_mark() to
|
||||
|
||||
@@ -223,6 +223,11 @@ int hashfile_truncate(struct hashfile *f, struct hashfile_checkpoint *checkpoint
|
||||
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);
|
||||
|
||||
@@ -39,6 +39,7 @@ struct hashfile_checkpoint {
|
||||
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
|
||||
|
||||
@@ -1639,6 +1639,8 @@ static int index_blob_packfile_transaction(struct odb_transaction_files *transac
|
||||
state->alloc_written);
|
||||
state->written[state->nr_written++] = idx;
|
||||
}
|
||||
|
||||
hashfile_checkpoint_release(&checkpoint);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user