diff --git a/src/node_zlib.cc b/src/node_zlib.cc index 4984989bb44066..0712f8feec6f08 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -258,7 +258,8 @@ class ZCtx : public AsyncWrap { } } while (ctx->strm_.avail_in >= GZIP_MIN_HEADER_SIZE && - ctx->mode_ == GUNZIP) { + ctx->mode_ == GUNZIP && + ctx->err_ == Z_STREAM_END) { // Bytes remain in input buffer. Perhaps this is another compressed // member in the same archive, or just trailing garbage. // Check the header to find out. diff --git a/test/fixtures/pseudo-multimember-gzip.gz b/test/fixtures/pseudo-multimember-gzip.gz new file mode 100644 index 00000000000000..a019c484d85482 Binary files /dev/null and b/test/fixtures/pseudo-multimember-gzip.gz differ diff --git a/test/fixtures/pseudo-multimember-gzip.z b/test/fixtures/pseudo-multimember-gzip.z new file mode 100644 index 00000000000000..e87b13ab534fbc Binary files /dev/null and b/test/fixtures/pseudo-multimember-gzip.z differ diff --git a/test/parallel/test-zlib-from-concatenated-gzip.js b/test/parallel/test-zlib-from-concatenated-gzip.js index 9bee905b33836b..36650e7b3b737f 100644 --- a/test/parallel/test-zlib-from-concatenated-gzip.js +++ b/test/parallel/test-zlib-from-concatenated-gzip.js @@ -4,6 +4,8 @@ const common = require('../common'); const assert = require('assert'); const zlib = require('zlib'); +const path = require('path'); +const fs = require('fs'); const data = Buffer.concat([ zlib.gzipSync('abc'), @@ -16,3 +18,23 @@ zlib.gunzip(data, common.mustCall((err, result) => { assert.ifError(err); assert.equal(result, 'abcdef', 'result should match original string'); })); + +// files that have the "right" magic bytes for starting a new gzip member +// in the middle of themselves, even if they are part of a single +// regularly compressed member +const pmmFileZlib = path.join(common.fixturesDir, 'pseudo-multimember-gzip.z'); +const pmmFileGz = path.join(common.fixturesDir, 'pseudo-multimember-gzip.gz'); + +const pmmExpected = zlib.inflateSync(fs.readFileSync(pmmFileZlib)); +const pmmResultBuffers = []; + +fs.createReadStream(pmmFileGz) + .pipe(zlib.createGunzip()) + .on('error', (err) => { + assert.ifError(err); + }) + .on('data', (data) => pmmResultBuffers.push(data)) + .on('finish', common.mustCall(() => { + assert.deepStrictEqual(Buffer.concat(pmmResultBuffers), pmmExpected, + 'result should match original random garbage'); + }));