diff --git a/sha1_file.c b/sha1_file.c index d451a94efed7d36d55cf1b77324eaf55e0d50d69..6b7577dbc4ed845da1a70b6d727370423b086735 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -321,12 +321,16 @@ struct packed_git *packed_git; static int check_packed_git_idx(const char *path, unsigned long *idx_size_, void **idx_map_) { + SHA_CTX ctx; + unsigned char sha1[20]; void *idx_map; unsigned int *index; unsigned long idx_size; int nr, i; - int fd = open(path, O_RDONLY); + int fd; struct stat st; + + fd = open(path, O_RDONLY); if (fd < 0) return -1; if (fstat(fd, &st)) { @@ -364,6 +368,16 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_, if (idx_size != 4*256 + nr * 24 + 20 + 20) return error("wrong index file size"); + /* + * File checksum. + */ + SHA1_Init(&ctx); + SHA1_Update(&ctx, idx_map, idx_size-20); + SHA1_Final(sha1, &ctx); + + if (memcmp(sha1, idx_map + idx_size - 20, 20)) + return error("index checksum mismatch"); + return 0; } diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 5b50536b54ff84b6a6e51c210be39773c6879443..7dfb1ab77b070447c4dd2b9f645785feec6f5480 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -163,6 +163,13 @@ test_expect_success \ else :; fi && + cp test-1-${packname_1}.pack test-3.pack && + dd if=/dev/zero of=test-3.idx count=1 bs=1 conv=notrunc seek=1200 && + if git-verify-pack test-3.pack + then false + else :; + fi && + :' test_expect_success \