summaryrefslogtreecommitdiff
path: root/src
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-04 21:38:30 +0200
commitb43da45bc31a5d09fc03e8bb1ce7c3f875bdfaaa (patch)
tree1a03f15508fa842f84d54a874d9d6316695ebcd7 /src
parentc4c8aa5ba0ec6bf4c6d74c4807b66edfbd91be7c (diff)
downloadapk-tools-b43da45bc31a5d09fc03e8bb1ce7c3f875bdfaaa.tar.gz
apk-tools-b43da45bc31a5d09fc03e8bb1ce7c3f875bdfaaa.tar.bz2
apk-tools-b43da45bc31a5d09fc03e8bb1ce7c3f875bdfaaa.tar.xz
apk-tools-b43da45bc31a5d09fc03e8bb1ce7c3f875bdfaaa.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')
-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;