From 5e62eee4f4c415afab5a1e38a266a5318f0c3a33 Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Wed, 3 Feb 2021 22:46:19 +0200 Subject: 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). --- src/io_gunzip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') 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; -- cgit v1.2.3-70-g09d2