summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sha1_file.c16
-rwxr-xr-xt/t5300-pack-object.sh7
2 files changed, 22 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c
index d451a94efe..6b7577dbc4 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 5b50536b54..7dfb1ab77b 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 \