X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=sha1_file.c;h=6b7577dbc4ed845da1a70b6d727370423b086735;hb=50b4e0c178777a27164eb67676593255a9cbd035;hp=d451a94efed7d36d55cf1b77324eaf55e0d50d69;hpb=1e80e0449248edb77b0fb9853f4a3404a599e207;p=git.git diff --git a/sha1_file.c b/sha1_file.c index d451a94e..6b7577db 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; }