fsck: detect null sha1 in tree entries
Short of somebody happening to beat the 1 in 2^160 odds of actually generating content that hashes to the null sha1, we should never see this value in a tree entry. So let's have fsck warn if it it seen. As in the previous commit, we test both blob and submodule entries to future-proof the test suite against the implementation depending on connectivity to notice the error. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
4337b5856f
commit
c479d14a80
8
fsck.c
8
fsck.c
@ -139,6 +139,7 @@ static int verify_ordered(unsigned mode1, const char *name1, unsigned mode2, con
|
|||||||
static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
|
static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
int has_null_sha1 = 0;
|
||||||
int has_full_path = 0;
|
int has_full_path = 0;
|
||||||
int has_empty_name = 0;
|
int has_empty_name = 0;
|
||||||
int has_zero_pad = 0;
|
int has_zero_pad = 0;
|
||||||
@ -157,9 +158,12 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
|
|||||||
while (desc.size) {
|
while (desc.size) {
|
||||||
unsigned mode;
|
unsigned mode;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
const unsigned char *sha1;
|
||||||
|
|
||||||
tree_entry_extract(&desc, &name, &mode);
|
sha1 = tree_entry_extract(&desc, &name, &mode);
|
||||||
|
|
||||||
|
if (is_null_sha1(sha1))
|
||||||
|
has_null_sha1 = 1;
|
||||||
if (strchr(name, '/'))
|
if (strchr(name, '/'))
|
||||||
has_full_path = 1;
|
has_full_path = 1;
|
||||||
if (!*name)
|
if (!*name)
|
||||||
@ -207,6 +211,8 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
|
|||||||
}
|
}
|
||||||
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
if (has_null_sha1)
|
||||||
|
retval += error_func(&item->object, FSCK_WARN, "contains entries pointing to null sha1");
|
||||||
if (has_full_path)
|
if (has_full_path)
|
||||||
retval += error_func(&item->object, FSCK_WARN, "contains full pathnames");
|
retval += error_func(&item->object, FSCK_WARN, "contains full pathnames");
|
||||||
if (has_empty_name)
|
if (has_empty_name)
|
||||||
|
@ -217,4 +217,30 @@ test_expect_success 'rev-list --verify-objects with bad sha1' '
|
|||||||
grep -q "error: sha1 mismatch 63ffffffffffffffffffffffffffffffffffffff" out
|
grep -q "error: sha1 mismatch 63ffffffffffffffffffffffffffffffffffffff" out
|
||||||
'
|
'
|
||||||
|
|
||||||
|
_bz='\0'
|
||||||
|
_bz5="$_bz$_bz$_bz$_bz$_bz"
|
||||||
|
_bz20="$_bz5$_bz5$_bz5$_bz5"
|
||||||
|
|
||||||
|
test_expect_success 'fsck notices blob entry pointing to null sha1' '
|
||||||
|
(git init null-blob &&
|
||||||
|
cd null-blob &&
|
||||||
|
sha=$(printf "100644 file$_bz$_bz20" |
|
||||||
|
git hash-object -w --stdin -t tree) &&
|
||||||
|
git fsck 2>out &&
|
||||||
|
cat out &&
|
||||||
|
grep "warning.*null sha1" out
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'fsck notices submodule entry pointing to null sha1' '
|
||||||
|
(git init null-commit &&
|
||||||
|
cd null-commit &&
|
||||||
|
sha=$(printf "160000 submodule$_bz$_bz20" |
|
||||||
|
git hash-object -w --stdin -t tree) &&
|
||||||
|
git fsck 2>out &&
|
||||||
|
cat out &&
|
||||||
|
grep "warning.*null sha1" out
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user