node/test/parallel/test-zlib-from-gzip-with-trailing-garbage.js
Kári Tristan Helgason f380db237b zlib: add support for concatenated members
According to the spec gzipped archives can contain more than one
compressed member. Previously Node's gzip implementation would only
unzip the first member and throw away the rest of the compressed data.
Issue #4306 is an example of this occurring in daily use.

Fixes: https://github.com/nodejs/node/issues/4306
PR-URL: https://github.com/nodejs/node/pull/5120
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
2016-03-15 16:47:10 +01:00

51 lines
1.3 KiB
JavaScript

'use strict';
// test unzipping a gzip file that has trailing garbage
const common = require('../common');
const assert = require('assert');
const zlib = require('zlib');
// should ignore trailing null-bytes
let data = Buffer.concat([
zlib.gzipSync('abc'),
zlib.gzipSync('def'),
Buffer(10).fill(0)
]);
assert.equal(zlib.gunzipSync(data).toString(), 'abcdef');
zlib.gunzip(data, common.mustCall((err, result) => {
assert.ifError(err);
assert.equal(result, 'abcdef', 'result should match original string');
}));
// if the trailing garbage happens to look like a gzip header, it should
// throw an error.
data = Buffer.concat([
zlib.gzipSync('abc'),
zlib.gzipSync('def'),
Buffer([0x1f, 0x8b, 0xff, 0xff]),
Buffer(10).fill(0)
]);
assert.throws(() => zlib.gunzipSync(data));
zlib.gunzip(data, common.mustCall((err, result) => {
assert(err);
}));
// In this case the trailing junk is too short to be a gzip segment
// So we ignore it and decompression succeeds.
data = Buffer.concat([
zlib.gzipSync('abc'),
zlib.gzipSync('def'),
Buffer([0x1f, 0x8b, 0xff, 0xff])
]);
assert.equal(zlib.gunzipSync(data).toString(), 'abcdef');
zlib.gunzip(data, common.mustCall((err, result) => {
assert.ifError(err);
assert.equal(result, 'abcdef', 'result should match original string');
}));