commit 8bb2b40c0fb2116f6e878aa78960309ecf7740f6 from: Stefan Sperling date: Wed Mar 18 16:13:42 2020 UTC fix CRC values in generated pack index commit - c5621f1ccb44ea1d23cb07ba3c4429145e969570 commit + 8bb2b40c0fb2116f6e878aa78960309ecf7740f6 blob - 0418b2da4cb3006d9ee541182e187be7ff6f5683 blob + ddea7438fde35927dd8f8d638e8af637251095e6 --- libexec/got-index-pack/got-index-pack.c +++ libexec/got-index-pack/got-index-pack.c @@ -231,12 +231,11 @@ object_crc(int packfd, struct got_indexed_object *obj) size_t n; ssize_t r; - obj->crc = 0; - if (lseek(packfd, obj->off + obj->tslen, SEEK_SET) == -1) + if (lseek(packfd, obj->off, SEEK_SET) == -1) return got_error_from_errno("lseek"); obj->crc = crc32(0L, NULL, 0); - for (n = obj->len; n > 0; n -= r){ + for (n = obj->tslen + obj->len; n > 0; n -= r){ r = read(packfd, buf, n > sizeof(buf) ? sizeof(buf) : n); if (r == -1) return got_error_from_errno("read"); @@ -416,6 +415,16 @@ update_packidx(int *nlarge, struct got_packidx *packid } } +static int +indexed_obj_cmp(const void *pa, const void *pb) +{ + struct got_indexed_object *a, *b; + + a = *(struct got_indexed_object **)pa; + b = *(struct got_indexed_object **)pb; + return got_object_id_cmp(&a->id, &b->id); +} + static const struct got_error * index_pack(struct got_pack *pack, int idxfd, uint8_t *pack_hash, struct imsgbuf *ibuf) @@ -639,6 +648,8 @@ index_pack(struct got_pack *pack, int idxfd, uint8_t * nobj * SHA1_DIGEST_LENGTH, &ctx); if (err) goto done; + mergesort(objects, nobj, sizeof(struct got_indexed_object *), + indexed_obj_cmp); for(i = 0; i < nobj; i++){ PUTBE32(buf, objects[i]->crc); err = hwrite(idxfd, buf, 4, &ctx);