aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-12-22 22:57:20 -0800
committerJunio C Hamano <junkio@cox.net>2005-12-23 14:14:28 -0800
commitc5ced64578a82b9d172aceb2f67c6fb9e639f6d9 (patch)
treece00f33992bbd7be504b6ba1c755fb1ffcca4542
parent1e80e0449248edb77b0fb9853f4a3404a599e207 (diff)
downloadgit-c5ced64578a82b9d172aceb2f67c6fb9e639f6d9.tar.gz
git-c5ced64578a82b9d172aceb2f67c6fb9e639f6d9.tar.xz
check_packed_git_idx(): check integrity of the idx file itself.
Although pack-check.c had routine to verify the checksum for the pack index file itself, the core did not check it before using it. This is stolen from the patch to tighten packname requirements. Signed-off-by: Junio C Hamano <junkio@cox.net> (cherry picked from 797bd6f490c91c07986382b9f268e0df712cb246 commit)
-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 d451a94ef..6b7577dbc 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 5b50536b5..7dfb1ab77 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 \