提交 93cff9a9 编写于 作者: J Jeff King 提交者: Junio C Hamano

sha1_loose_object_info: return error for corrupted objects

When sha1_loose_object_info() finds that a loose object file
cannot be stat(2)ed or mmap(2)ed, it returns -1 to signal an
error to the caller.  However, if it found that the loose
object file is corrupt and the object data cannot be used
from it, it stuffs OBJ_BAD into "type" field of the
object_info, but returns zero (i.e., success), which can
confuse callers.

This is due to 052fe5ea (sha1_loose_object_info: make type
lookup optional, 2013-07-12), which switched the return to a
strict success/error, rather than returning the type (but
botched the return).

Callers of regular sha1_object_info() don't notice the
difference, as that function returns the type (which is
OBJ_BAD in this case). However, direct callers of
sha1_object_info_extended() see the function return success,
but without setting any meaningful values in the object_info
struct, leading them to access potentially uninitialized
memory.

The easiest way to see the bug is via "cat-file -s", which
will happily ignore the corruption and report whatever
value happened to be in the "size" variable.
Signed-off-by: NJeff King <peff@peff.net>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 49800c94
...@@ -2867,7 +2867,7 @@ static int sha1_loose_object_info(const unsigned char *sha1, ...@@ -2867,7 +2867,7 @@ static int sha1_loose_object_info(const unsigned char *sha1,
if (status && oi->typep) if (status && oi->typep)
*oi->typep = status; *oi->typep = status;
strbuf_release(&hdrbuf); strbuf_release(&hdrbuf);
return 0; return (status < 0) ? status : 0;
} }
int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags) int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags)
......
...@@ -53,6 +53,13 @@ test_expect_success 'streaming a corrupt blob fails' ' ...@@ -53,6 +53,13 @@ test_expect_success 'streaming a corrupt blob fails' '
) )
' '
test_expect_success 'getting type of a corrupt blob fails' '
(
cd bit-error &&
test_must_fail git cat-file -s HEAD:content.t
)
'
test_expect_success 'read-tree -u detects bit-errors in blobs' ' test_expect_success 'read-tree -u detects bit-errors in blobs' '
( (
cd bit-error && cd bit-error &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册