commit 6fb3a4970337c135644ac0ef619a7e96616e4230 from: Stefan Sperling date: Wed Mar 18 16:11:29 2020 UTC add optional 'consumed' output parameter to got_inflate_to_mem() commit - 4b57020975f73d8c07712c7d26151f50205df436 commit + 6fb3a4970337c135644ac0ef619a7e96616e4230 blob - f90aa5f4ddf0dd9604fea24747c458881d7c75ec blob + 90304d53d37a65e9e7ed2a7006e82d694b650c1a --- lib/got_lib_inflate.h +++ lib/got_lib_inflate.h @@ -30,13 +30,14 @@ struct got_inflate_buf { const struct got_error *got_inflate_init(struct got_inflate_buf *, uint8_t *, size_t); const struct got_error *got_inflate_read(struct got_inflate_buf *, FILE *, - size_t *); + size_t *, size_t *); const struct got_error *got_inflate_read_fd(struct got_inflate_buf *, int, 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 *, FILE *); +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_mmap(uint8_t **, size_t *, uint8_t *, size_t, size_t); blob - 472aaa11edacfa2b14007043174136b80ff00ba9 blob + 02b01b5e5827923af47d173a9b3c62a8eab8922f --- lib/inflate.c +++ lib/inflate.c @@ -81,9 +81,11 @@ done: } const struct got_error * -got_inflate_read(struct got_inflate_buf *zb, FILE *f, size_t *outlenp) +got_inflate_read(struct got_inflate_buf *zb, FILE *f, 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; @@ -91,6 +93,8 @@ got_inflate_read(struct got_inflate_buf *zb, FILE *f, z->avail_out = zb->outlen; *outlenp = 0; + if (consumed) + *consumed = 0; do { if (z->avail_in == 0) { size_t n = fread(zb->inbuf, 1, zb->inlen, f); @@ -116,6 +120,8 @@ got_inflate_read(struct got_inflate_buf *zb, FILE *f, } *outlenp = z->total_out - last_total_out; + if (consumed) + *consumed += z->total_in - last_total_in; return NULL; } @@ -209,10 +215,11 @@ got_inflate_end(struct got_inflate_buf *zb) } const struct got_error * -got_inflate_to_mem(uint8_t **outbuf, size_t *outlen, FILE *f) +got_inflate_to_mem(uint8_t **outbuf, size_t *outlen, + size_t *consumed_total, FILE *f) { const struct got_error *err; - size_t avail; + size_t avail, consumed; struct got_inflate_buf zb; void *newbuf; int nbuf = 1; @@ -225,12 +232,16 @@ got_inflate_to_mem(uint8_t **outbuf, size_t *outlen, F return err; *outlen = 0; + if (consumed_total) + *consumed_total = 0; do { - err = got_inflate_read(&zb, f, &avail); + err = got_inflate_read(&zb, f, &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); @@ -362,7 +373,7 @@ got_inflate_to_fd(size_t *outlen, FILE *infile, int ou *outlen = 0; do { - err = got_inflate_read(&zb, infile, &avail); + err = got_inflate_read(&zb, infile, &avail, NULL); if (err) goto done; if (avail > 0) { @@ -399,7 +410,7 @@ got_inflate_to_file(size_t *outlen, FILE *infile, FILE *outlen = 0; do { - err = got_inflate_read(&zb, infile, &avail); + err = got_inflate_read(&zb, infile, &avail, NULL); if (err) goto done; if (avail > 0) { blob - c1ce38c213a13c5547fb6643db2aa79a36185545 blob + 1e044637ec38d03deda6d442ef53cad1853a8456 --- libexec/got-index-pack/got-index-pack.c +++ libexec/got-index-pack/got-index-pack.c @@ -530,7 +530,7 @@ readrdelta(FILE *f, Object *o, int nd, int flag) goto error; if(hasheq(&o->hash, &h)) goto error; - if ((e = got_inflate_to_mem(&d, &n, f)) != NULL) + if ((e = got_inflate_to_mem(&d, &n, NULL, f)) != NULL) goto error; o->len = ftello(f) - o->off; if(d == NULL || n != nd) @@ -572,7 +572,7 @@ readodelta(FILE *f, Object *o, off_t nd, off_t p, int goto error; } - if (got_inflate_to_mem(&d, &n, f) != NULL) + if (got_inflate_to_mem(&d, &n, NULL, f) != NULL) goto error; o->len = ftello(f) - o->off; if(d == NULL || n != nd) @@ -632,7 +632,7 @@ readpacked(FILE *f, Object *o, int flag) b.data = emalloc(b.sz); n = snprintf(b.data, 64, "%s %lld", typestr(t), l) + 1; b.len = n; - e = got_inflate_to_mem(&data, &ndata, f); + e = got_inflate_to_mem(&data, &ndata, NULL, f); if (e != NULL || n + ndata >= b.sz) { free(b.data); return -1; @@ -674,7 +674,7 @@ readloose(FILE *f, Object *o, int flag) size_t n; int l; - if (got_inflate_to_mem(&d, &n, f) != NULL) + if (got_inflate_to_mem(&d, &n, NULL, f) != NULL) return -1; s = (char *)d; blob - 02a103779a91cce8d7052cb4234b3aab5431b57d blob + 259da2e7e9b6fd36089b5396d4ef34f94744a694 --- libexec/got-read-blob/got-read-blob.c +++ libexec/got-read-blob/got-read-blob.c @@ -146,7 +146,7 @@ main(int argc, char *argv[]) if (obj->size + obj->hdrlen <= GOT_PRIVSEP_INLINE_BLOB_DATA_MAX) { - err = got_inflate_to_mem(&buf, &size, f); + err = got_inflate_to_mem(&buf, &size, NULL, f); if (err) goto done; } else { blob - 546aa7c0b0739f71ac9bf7d92006ee13fdb65fc4 blob + 24e3dce4fa25b6cdd345bf34190e5a0c4c476dba --- libexec/got-read-commit/got-read-commit.c +++ libexec/got-read-commit/got-read-commit.c @@ -55,7 +55,7 @@ read_commit_object(struct got_commit_object **commit, size_t len; uint8_t *p; - err = got_inflate_to_mem(&p, &len, f); + err = got_inflate_to_mem(&p, &len, NULL, f); if (err) return err; blob - 5839f14c44eb5fd1c9f7d9c59752aaff7d7e5bfb blob + c9959de2131e52c0fd9d5bdd3d72e5504cdfaeb8 --- libexec/got-read-tag/got-read-tag.c +++ libexec/got-read-tag/got-read-tag.c @@ -55,7 +55,7 @@ read_tag_object(struct got_tag_object **tag, FILE *f) size_t len; uint8_t *p; - err = got_inflate_to_mem(&p, &len, f); + err = got_inflate_to_mem(&p, &len, NULL, f); if (err) return err; blob - dc6d4d5dee5cf370fb3fd6389ea727153a2f965c blob + 577f7c91bd72d65e5741061fa641b0b5b20237f6 --- libexec/got-read-tree/got-read-tree.c +++ libexec/got-read-tree/got-read-tree.c @@ -56,7 +56,7 @@ read_tree_object(struct got_pathlist_head *entries, in struct got_object *obj; size_t len; - err = got_inflate_to_mem(p, &len, f); + err = got_inflate_to_mem(p, &len, NULL, f); if (err) return err;