summaryrefslogtreecommitdiff
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
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).
-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;