mirror of
https://github.com/git/git.git
synced 2026-08-05 07:31:02 +00:00
check_stream_oid(): discard hash on read error
The happy path of check_stream_oid() is to initialize a hash, feed the
loose object zlib stream into it, and then get the final result. But if
we hit a zlib error or see extra cruft we'll bail early with an error.
Since we never call git_hash_final() in this cases, any resources held
by the git_hash_ctx may be leaked. Our default hash algorithms don't
allocate anything in the hash_ctx, but some implementations do. For
example, running:
make SANITIZE=leak \
OPENSSL_SHA256=1 \
GIT_TEST_DEFAULT_HASH=sha256 \
test
will fail t1450, since it feeds corrupted objects that cause us to bail
from check_stream_oid(). This patch fixes it by discarding the hash in
those early return paths. Trying to jump to a common "out:" label is not
worth it here, as we must _not_ discard a hash that was already fed to
git_hash_final(). And the hash_ctx itself does not carry any information
(so we cannot check for a NULL pointer, etc).
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
64b6922562
commit
77f78b8025
@@ -2122,11 +2122,13 @@ static int check_stream_oid(git_zstream *stream,
|
||||
|
||||
if (status != Z_STREAM_END) {
|
||||
error(_("corrupt loose object '%s'"), oid_to_hex(expected_oid));
|
||||
git_hash_discard(&c);
|
||||
return -1;
|
||||
}
|
||||
if (stream->avail_in) {
|
||||
error(_("garbage at end of loose object '%s'"),
|
||||
oid_to_hex(expected_oid));
|
||||
git_hash_discard(&c);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user