commit - fc4dc3ce204190ef63c9b748c30137f11cec86be
commit + fb2a9ab8a28891a770e6d0c260b76dfba2f2f369
blob - eb4cc4d7fd73f259f3ba94f94963980b5cbfe2ae
blob + c8de52c69b4567e1b40a221dd6e87c77f6e50ff6
--- lib/got_lib_pack.h
+++ lib/got_lib_pack.h
/* See Documentation/technical/pack-format.txt in Git. */
struct got_packidx_trailer {
- u_int8_t packfile_hash[SHA1_DIGEST_LENGTH];
- u_int8_t packidx_hash[SHA1_DIGEST_LENGTH];
+ uint8_t packfile_hash[GOT_OBJECT_ID_MAXLEN];
+ uint8_t packidx_hash[GOT_OBJECT_ID_MAXLEN];
} __attribute__((__packed__));
struct got_packidx_object_id {
/* Large offsets table is empty for pack files < 2 GB. */
uint64_t *large_offsets; /* values are big endian */
- struct got_packidx_trailer *trailer;
+ struct got_packidx_trailer trailer;
};
struct got_pack_offset_index {
blob - 8f78e8b10321ed161ab6578ceb6672c339db36a0
blob + d190434cc5cacc38d158263b23499c9c90aa69d2
--- lib/pack.c
+++ lib/pack.c
offset += p->nlargeobj * sizeof(*h->large_offsets);
checksum:
- if (remain < sizeof(*h->trailer)) {
+ if (remain < 2 * got_hash_digest_length(p->algo)) {
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- if (p->map)
- h->trailer =
- (struct got_packidx_trailer *)((uint8_t*)(p->map + offset));
- else {
- h->trailer = malloc(sizeof(*h->trailer));
- if (h->trailer == NULL) {
- err = got_error_from_errno("malloc");
+ if (p->map) {
+ const uint8_t *base = p->map + offset;
+
+ memcpy(&h->trailer.packfile_hash, base,
+ got_hash_digest_length(p->algo));
+ base += got_hash_digest_length(p->algo);
+ memcpy(&h->trailer.packidx_hash, base,
+ got_hash_digest_length(p->algo));
+ } else {
+ err = NULL;
+ n = read(p->fd, &h->trailer.packfile_hash,
+ got_hash_digest_length(p->algo));
+ if (n < 0)
+ err = got_error_from_errno("read");
+ else if (n != got_hash_digest_length(p->algo))
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ if (err)
goto done;
- }
- n = read(p->fd, h->trailer, sizeof(*h->trailer));
+
+ n = read(p->fd, &h->trailer.packidx_hash,
+ got_hash_digest_length(p->algo));
if (n < 0)
err = got_error_from_errno("read");
- else if (n != sizeof(*h->trailer)) {
+ else if (n != got_hash_digest_length(p->algo))
err = got_error(GOT_ERR_BAD_PACKIDX);
+ if (err)
goto done;
- }
}
if (verify) {
- got_hash_update(&ctx, h->trailer->packfile_hash,
+ got_hash_update(&ctx, h->trailer.packfile_hash,
got_hash_digest_length(p->algo));
got_hash_final(&ctx, hash);
- if (got_hash_cmp(&ctx, hash, h->trailer->packidx_hash) != 0)
+ if (got_hash_cmp(&ctx, hash, h->trailer.packidx_hash) != 0)
err = got_error(GOT_ERR_PACKIDX_CSUM);
}
done:
free(packidx->hdr.crc32);
free(packidx->hdr.offsets);
free(packidx->hdr.large_offsets);
- free(packidx->hdr.trailer);
}
if (close(packidx->fd) == -1 && err == NULL)
err = got_error_from_errno("close");