diff options
author | Derrick Stolee <derrickstolee@github.com> | 2023-04-17 18:21:40 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-04-17 23:39:04 +0200 |
commit | 5f658d1b577722111564f51962d6af33d1fe96c6 (patch) | |
tree | 013eb66125406727024d481aaf33511055356ec1 /pack-revindex.c | |
parent | fsck: check rev-index checksums (diff) | |
download | git-5f658d1b577722111564f51962d6af33d1fe96c6.tar.xz git-5f658d1b577722111564f51962d6af33d1fe96c6.zip |
fsck: check rev-index position values
When checking a rev-index file, it may be helpful to identify exactly
which positions are incorrect. Compare the rev-index to a
freshly-computed in-memory rev-index and report the comparison failures.
This additional check (on top of the checksum validation) can help find
files that were corrupt by a single bit flip on-disk or perhaps were
written incorrectly due to a bug in Git.
Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'pack-revindex.c')
-rw-r--r-- | pack-revindex.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/pack-revindex.c b/pack-revindex.c index 007a806994..62a9846470 100644 --- a/pack-revindex.c +++ b/pack-revindex.c @@ -310,16 +310,33 @@ int load_pack_revindex(struct repository *r, struct packed_git *p) */ int verify_pack_revindex(struct packed_git *p) { + int res = 0; + /* Do not bother checking if not initialized. */ - if (!p->revindex_map) - return 0; + if (!p->revindex_map || !p->revindex_data) + return res; if (!hashfile_checksum_valid((const unsigned char *)p->revindex_map, p->revindex_size)) { error(_("invalid checksum")); - return -1; + res = -1; } - return 0; + /* This may fail due to a broken .idx. */ + if (create_pack_revindex_in_memory(p)) + return res; + + for (size_t i = 0; i < p->num_objects; i++) { + uint32_t nr = p->revindex[i].nr; + uint32_t rev_val = get_be32(p->revindex_data + i); + + if (nr != rev_val) { + error(_("invalid rev-index position at %"PRIu64": %"PRIu32" != %"PRIu32""), + (uint64_t)i, nr, rev_val); + res = -1; + } + } + + return res; } int load_midx_revindex(struct multi_pack_index *m) |