diff options
author | Timo Teräs <timo.teras@iki.fi> | 2021-02-03 22:46:19 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2021-02-07 15:25:05 +0200 |
commit | 5e62eee4f4c415afab5a1e38a266a5318f0c3a33 (patch) | |
tree | 571f2bf7291df20d501e5edb4623b18a8dede435 | |
parent | e141870554783ffee30da8b358120f77095b7268 (diff) | |
download | apk-tools-5e62eee4f4c415afab5a1e38a266a5318f0c3a33.tar.gz apk-tools-5e62eee4f4c415afab5a1e38a266a5318f0c3a33.tar.bz2 apk-tools-5e62eee4f4c415afab5a1e38a266a5318f0c3a33.tar.xz apk-tools-5e62eee4f4c415afab5a1e38a266a5318f0c3a33.zip |
gunzip: fix false end-of-file condition in rare circumstances
It turns out inflate() can output zero bytes, even if it consumed
data. This had the unfortunate side effect of returning zero bytes
(end-of-file) condition before calling the boundary callbacks. This
fixes the logic to not return zero reads on gzip boundary.
In practice this fixes the seldom seen issues of apk reporting
bad signature (when it was correct).
-rw-r--r-- | src/io_gunzip.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/io_gunzip.c b/src/io_gunzip.c index 70f5b6f..554a95a 100644 --- a/src/io_gunzip.c +++ b/src/io_gunzip.c @@ -104,7 +104,7 @@ static ssize_t gzi_read(struct apk_istream *is, void *ptr, size_t size) inflateEnd(&gis->zs); if (inflateInit2(&gis->zs, 15+32) != Z_OK) return -ENOMEM; - if (gis->cb) goto ret; + if (gis->cb && gis->zs.avail_out != size) goto ret; break; case Z_OK: break; |