Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrick Stolee <derrickstolee@github.com>2023-04-17 19:21:40 +0300
committerJunio C Hamano <gitster@pobox.com>2023-04-18 00:39:04 +0300
commit5f658d1b577722111564f51962d6af33d1fe96c6 (patch)
tree013eb66125406727024d481aaf33511055356ec1 /pack-revindex.c
parentd975fe1fa57d57cfd21a97f96f4a94b99f50f2f4 (diff)
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.c25
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)