fsck: check rev-index checksums
The previous change added calls to verify_pack_revindex() in builtin/fsck.c, but the implementation of the method was left empty. Add the first and most-obvious check to this method: checksum verification. While here, create a helper method in the test script that makes it easy to adjust the .rev file and check that 'git fsck' reports the correct error message. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0d30feef3c
commit
d975fe1fa5
@ -5,6 +5,7 @@
|
|||||||
#include "packfile.h"
|
#include "packfile.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "midx.h"
|
#include "midx.h"
|
||||||
|
#include "csum-file.h"
|
||||||
|
|
||||||
struct revindex_entry {
|
struct revindex_entry {
|
||||||
off_t offset;
|
off_t offset;
|
||||||
@ -309,6 +310,15 @@ int load_pack_revindex(struct repository *r, struct packed_git *p)
|
|||||||
*/
|
*/
|
||||||
int verify_pack_revindex(struct packed_git *p)
|
int verify_pack_revindex(struct packed_git *p)
|
||||||
{
|
{
|
||||||
|
/* Do not bother checking if not initialized. */
|
||||||
|
if (!p->revindex_map)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!hashfile_checksum_valid((const unsigned char *)p->revindex_map, p->revindex_size)) {
|
||||||
|
error(_("invalid checksum"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,4 +145,44 @@ test_expect_success 'fsck succeeds on good rev-index' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'set up rev-index corruption tests' '
|
||||||
|
git init corrupt &&
|
||||||
|
(
|
||||||
|
cd corrupt &&
|
||||||
|
|
||||||
|
test_commit commit &&
|
||||||
|
git -c pack.writeReverseIndex=true repack -ad &&
|
||||||
|
|
||||||
|
revfile=$(ls .git/objects/pack/pack-*.rev) &&
|
||||||
|
chmod a+w $revfile &&
|
||||||
|
cp $revfile $revfile.bak
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
corrupt_rev_and_verify () {
|
||||||
|
(
|
||||||
|
pos="$1" &&
|
||||||
|
value="$2" &&
|
||||||
|
error="$3" &&
|
||||||
|
|
||||||
|
cd corrupt &&
|
||||||
|
revfile=$(ls .git/objects/pack/pack-*.rev) &&
|
||||||
|
|
||||||
|
# Reset to original rev-file.
|
||||||
|
cp $revfile.bak $revfile &&
|
||||||
|
|
||||||
|
printf "$value" | dd of=$revfile bs=1 seek="$pos" conv=notrunc &&
|
||||||
|
test_must_fail git fsck 2>err &&
|
||||||
|
grep "$error" err
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success 'fsck catches invalid checksum' '
|
||||||
|
revfile=$(ls corrupt/.git/objects/pack/pack-*.rev) &&
|
||||||
|
orig_size=$(wc -c <$revfile) &&
|
||||||
|
hashpos=$((orig_size - 10)) &&
|
||||||
|
corrupt_rev_and_verify $hashpos bogus \
|
||||||
|
"invalid checksum"
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user