commit 3ab5e33ce18309779415bf4e5e2464cbf01b06ac from: Stefan Sperling date: Wed Mar 18 16:13:41 2020 UTC add optional 'consumed' output parameter to got_inflate_to_mem_fd() commit - baa9fea074326a73792e66efbca9746a1bccc596 commit + 3ab5e33ce18309779415bf4e5e2464cbf01b06ac blob - 90304d53d37a65e9e7ed2a7006e82d694b650c1a blob + d8d1ad0afb7092c9dbd63eb106bf5bdf1aed6b19 --- lib/got_lib_inflate.h +++ lib/got_lib_inflate.h @@ -32,13 +32,14 @@ const struct got_error *got_inflate_init(struct got_in const struct got_error *got_inflate_read(struct got_inflate_buf *, FILE *, size_t *, size_t *); const struct got_error *got_inflate_read_fd(struct got_inflate_buf *, int, - size_t *); + size_t *, size_t *); const struct got_error *got_inflate_read_mmap(struct got_inflate_buf *, uint8_t *, size_t, size_t, size_t *, size_t *); void got_inflate_end(struct got_inflate_buf *); const struct got_error *got_inflate_to_mem(uint8_t **, size_t *, size_t *, FILE *); -const struct got_error *got_inflate_to_mem_fd(uint8_t **, size_t *, int); +const struct got_error *got_inflate_to_mem_fd(uint8_t **, size_t *, size_t *, + int); const struct got_error *got_inflate_to_mem_mmap(uint8_t **, size_t *, uint8_t *, size_t, size_t); const struct got_error *got_inflate_to_file(size_t *, FILE *, FILE *); blob - 02b01b5e5827923af47d173a9b3c62a8eab8922f blob + 75a81b01b8a5d3d012375c8636e429982efe65c1 --- lib/inflate.c +++ lib/inflate.c @@ -126,9 +126,11 @@ got_inflate_read(struct got_inflate_buf *zb, FILE *f, } const struct got_error * -got_inflate_read_fd(struct got_inflate_buf *zb, int fd, size_t *outlenp) +got_inflate_read_fd(struct got_inflate_buf *zb, int fd, size_t *outlenp, + size_t *consumed) { size_t last_total_out = zb->z.total_out; + size_t last_total_in = zb->z.total_in; z_stream *z = &zb->z; int ret = Z_ERRNO; @@ -136,6 +138,8 @@ got_inflate_read_fd(struct got_inflate_buf *zb, int fd z->avail_out = zb->outlen; *outlenp = 0; + if (consumed) + *consumed = 0; do { if (z->avail_in == 0) { ssize_t n = read(fd, zb->inbuf, zb->inlen); @@ -161,6 +165,8 @@ got_inflate_read_fd(struct got_inflate_buf *zb, int fd } *outlenp = z->total_out - last_total_out; + if (consumed) + *consumed += z->total_in - last_total_in; return NULL; } @@ -264,10 +270,11 @@ done: } const struct got_error * -got_inflate_to_mem_fd(uint8_t **outbuf, size_t *outlen, int infd) +got_inflate_to_mem_fd(uint8_t **outbuf, size_t *outlen, + size_t *consumed_total, int infd) { const struct got_error *err; - size_t avail; + size_t avail, consumed; struct got_inflate_buf zb; void *newbuf; int nbuf = 1; @@ -280,12 +287,16 @@ got_inflate_to_mem_fd(uint8_t **outbuf, size_t *outlen goto done; *outlen = 0; + if (consumed_total) + *consumed_total = 0; do { - err = got_inflate_read_fd(&zb, infd, &avail); + err = got_inflate_read_fd(&zb, infd, &avail, &consumed); if (err) goto done; *outlen += avail; + if (consumed_total) + *consumed_total += consumed; if (zb.flags & GOT_INFLATE_F_HAVE_MORE) { newbuf = reallocarray(*outbuf, ++nbuf, GOT_INFLATE_BUFSIZE); @@ -445,7 +456,7 @@ got_inflate_to_file_fd(size_t *outlen, int infd, FILE *outlen = 0; do { - err = got_inflate_read_fd(&zb, infd, &avail); + err = got_inflate_read_fd(&zb, infd, &avail, NULL); if (err) goto done; if (avail > 0) { blob - d3584125c591dde528f7c8eb8d1eb44dd9728c86 blob + a4a82ed4280ba51077e164cd2fed73eeb6bba742 --- lib/object_parse.c +++ lib/object_parse.c @@ -227,7 +227,7 @@ got_object_read_header(struct got_object **obj, int fd totlen = 0; do { - err = got_inflate_read_fd(&zb, fd, &outlen); + err = got_inflate_read_fd(&zb, fd, &outlen, NULL); if (err) goto done; if (outlen == 0) blob - bc26681be69317165c703408cb33e6bea57719da blob + c2147b8044f1aa9ecd319e1f06a3e7eb56d26b46 --- lib/pack.c +++ lib/pack.c @@ -723,7 +723,8 @@ read_delta_data(uint8_t **delta_buf, size_t *delta_len } else { if (lseek(pack->fd, delta_data_offset, SEEK_SET) == -1) return got_error_from_errno("lseek"); - err = got_inflate_to_mem_fd(delta_buf, delta_len, pack->fd); + err = got_inflate_to_mem_fd(delta_buf, delta_len, NULL, + pack->fd); } return err; } @@ -823,6 +824,10 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru delta_data_offset = lseek(pack->fd, 0, SEEK_CUR); if (delta_data_offset == -1) return got_error_from_errno("lseek"); + err = got_inflate_to_mem_fd(&delta_buf, &delta_len, NULL, + pack->fd); + if (err) + return err; } err = add_delta(deltas, delta_offset, tslen, delta_type, delta_size, @@ -1102,7 +1107,7 @@ dump_delta_chain_to_file(size_t *result_size, struct g pack->filesize - mapoff); } else err = got_inflate_to_mem_fd(&base_buf, - &base_bufsz, pack->fd); + &base_bufsz, NULL, pack->fd); } if (err) goto done; @@ -1249,7 +1254,7 @@ dump_delta_chain_to_mem(uint8_t **outbuf, size_t *outl goto done; } err = got_inflate_to_mem_fd(&base_buf, - &base_bufsz, pack->fd); + &base_bufsz, NULL, pack->fd); } if (err) goto done; @@ -1369,7 +1374,7 @@ got_packfile_extract_object_to_mem(uint8_t **buf, size } else { if (lseek(pack->fd, obj->pack_offset, SEEK_SET) == -1) return got_error_from_errno("lseek"); - err = got_inflate_to_mem_fd(buf, len, pack->fd); + err = got_inflate_to_mem_fd(buf, len, NULL, pack->fd); } } else err = dump_delta_chain_to_mem(buf, len, &obj->deltas, pack);