commit - d2cdc63664daa5fa39c9a6398c33f3724650bfe9
commit + 849f755735bb4ec310eb3f688a23847c0c7162b5
blob - 4936c368b72d20f0700da9ef791558f5eeb7ef03
blob + e70d912a05e9ce0c6576bd19cc148720909a4e6f
--- lib/fetch.c
+++ lib/fetch.c
*repo_name = NULL;
}
return err;
+}
+
+static const struct got_error *
+check_pack_hash(int fd, size_t sz, uint8_t *hcomp)
+{
+ SHA1_CTX ctx;
+ uint8_t hexpect[SHA1_DIGEST_LENGTH];
+ uint8_t buf[32 * 1024];
+ ssize_t n, r, nr;
+
+ if (sz < sizeof(struct got_packfile_hdr) + SHA1_DIGEST_LENGTH)
+ return got_error_msg(GOT_ERR_BAD_PACKFILE, "short packfile");
+
+ n = 0;
+ SHA1Init(&ctx);
+ while (n < sz - 20) {
+ nr = sizeof(buf);
+ if (sz - n - 20 < sizeof(buf))
+ nr = sz - n - 20;
+ r = read(fd, buf, nr);
+ if (r == -1)
+ return got_error_from_errno("read");
+ if (r != nr)
+ return got_error_msg(GOT_ERR_BAD_PACKFILE,
+ "short pack file");
+ SHA1Update(&ctx, buf, nr);
+ n += r;
+ }
+ SHA1Final(hcomp, &ctx);
+
+ r = read(fd, hexpect, sizeof(hexpect));
+ if (r == -1)
+ return got_error_from_errno("read");
+ if (r != sizeof(hexpect))
+ return got_error_msg(GOT_ERR_BAD_PACKFILE,
+ "short pack file");
+
+ if (memcmp(hcomp, hexpect, SHA1_DIGEST_LENGTH) != 0)
+ return got_error_msg(GOT_ERR_BAD_PACKFILE,
+ "packfile checksum mismatch");
+
+ return NULL;
}
const struct got_error*
err = got_error_from_errno("waitpid");
goto done;
}
+
+ if (lseek(packfd, 0, SEEK_SET) == -1) {
+ err = got_error_from_errno("lseek");
+ goto done;
+ }
+ err = check_pack_hash(packfd, packfile_size, (*pack_hash)->sha1);
+ if (err)
+ goto done;
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, imsg_idxfds) == -1) {
err = got_error_from_errno("socketpair");
blob - 14fb915c5bf3a3ec428cfafcae915f83694cc47b
blob + bbc450c8f90abf44d108cd6ea866d2f55f94713e
--- libexec/got-fetch-pack/got-fetch-pack.c
+++ libexec/got-fetch-pack/got-fetch-pack.c
return NULL;
}
-static const struct got_error *
-check_pack_hash(int fd, size_t sz, uint8_t *hcomp)
-{
- const struct got_error *err = NULL;
- SHA1_CTX ctx;
- uint8_t hexpect[SHA1_DIGEST_LENGTH];
- uint8_t buf[32 * 1024];
- ssize_t n, r, nr;
-
- if (sz < sizeof(struct got_packfile_hdr) + SHA1_DIGEST_LENGTH)
- return got_error_msg(GOT_ERR_BAD_PACKFILE, "short packfile");
-
- n = 0;
- SHA1Init(&ctx);
- while (n < sz - 20) {
- nr = sizeof(buf);
- if (sz - n - 20 < sizeof(buf))
- nr = sz - n - 20;
- err = readn(&r, fd, buf, nr);
- if (err)
- return err;
- if (r != nr)
- return got_error(GOT_ERR_BAD_PACKFILE);
- SHA1Update(&ctx, buf, nr);
- n += r;
- }
- SHA1Final(hcomp, &ctx);
-
- err = readn(&r, fd, hexpect, sizeof(hexpect));
- if (err)
- return err;
- if (r != sizeof(hexpect))
- return got_error(GOT_ERR_BAD_PACKFILE);
- if (memcmp(hcomp, hexpect, SHA1_DIGEST_LENGTH) != 0)
- return got_error(GOT_ERR_BAD_PACKFILE);
- return NULL;
-}
-
static int
match_branch(char *br, char *pat)
{
if (err)
goto done;
}
- if (lseek(packfd, 0, SEEK_SET) == -1) {
- err = got_error_from_errno("lseek");
- goto done;
- }
- err = check_pack_hash(packfd, packsz, packid->sha1);
done:
TAILQ_FOREACH(pe, &symrefs, entry) {
free((void *)pe->path);