summaryrefslogtreecommitdiff
path: root/src/io_gunzip.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2021-02-03 22:46:19 +0200
committerTimo Teräs <timo.teras@iki.fi>2021-02-07 15:25:05 +0200
commit5e62eee4f4c415afab5a1e38a266a5318f0c3a33 (patch)
tree571f2bf7291df20d501e5edb4623b18a8dede435 /src/io_gunzip.c
parente141870554783ffee30da8b358120f77095b7268 (diff)
downloadapk-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).
Diffstat (limited to 'src/io_gunzip.c')
-rw-r--r--src/io_gunzip.c2
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;