read_loose_refs(): treat NULL_SHA1 loose references as broken
NULL_SHA1 is used to indicate an "invalid object name" throughout our code (and the code of other git implementations), so it is vastly more likely that an on-disk reference was set to this value due to a software bug than that NULL_SHA1 is the legitimate SHA-1 of an actual object. Therefore, if a loose reference has the value NULL_SHA1, consider it to be broken. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
f5517074f8
commit
501cf47cdd
10
refs.c
10
refs.c
@ -1297,6 +1297,16 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
|
||||
if (!read_ok) {
|
||||
hashclr(sha1);
|
||||
flag |= REF_ISBROKEN;
|
||||
} else if (is_null_sha1(sha1)) {
|
||||
/*
|
||||
* It is so astronomically unlikely
|
||||
* that NULL_SHA1 is the SHA-1 of an
|
||||
* actual object that we consider its
|
||||
* appearance in a loose reference
|
||||
* file to be repo corruption
|
||||
* (probably due to a software bug).
|
||||
*/
|
||||
flag |= REF_ISBROKEN;
|
||||
}
|
||||
|
||||
if (check_refname_format(refname.buf,
|
||||
|
@ -24,7 +24,7 @@ test_expect_success 'Broken refs are reported correctly' '
|
||||
test_cmp broken-err err
|
||||
'
|
||||
|
||||
test_expect_failure 'NULL_SHA1 refs are reported correctly' '
|
||||
test_expect_success 'NULL_SHA1 refs are reported correctly' '
|
||||
r=refs/heads/zeros &&
|
||||
echo $ZEROS >.git/$r &&
|
||||
test_when_finished "rm -f .git/$r" &&
|
||||
|
Loading…
Reference in New Issue
Block a user