Skip to content

Commit

Permalink
zlib: fix decompression of empty data streams
Browse files Browse the repository at this point in the history
add4b0a made the assumption that compressed data
would never lead to an empty decompressed stream.

Fix that by explicitly checking the number of read bytes.

Fixes: nodejs#17041
Refs: nodejs#13322
  • Loading branch information
addaleax committed Nov 15, 2017
1 parent 1601a3c commit 74afe5c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/zlib.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ function zlibBufferOnEnd() {
var err;
if (this.nread >= kMaxLength) {
err = new errors.RangeError('ERR_BUFFER_TOO_LARGE');
} else if (this.nread === 0) {
buf = Buffer.alloc(0);
} else {
var bufs = this.buffers;
buf = (bufs.length === 1 ? bufs[0] : Buffer.concat(bufs, this.nread));
Expand Down Expand Up @@ -485,6 +487,9 @@ function processChunkSync(self, chunk, flushFlag) {

_close(self);

if (nread === 0)
return Buffer.alloc(0);

return (buffers.length === 1 ? buffers[0] : Buffer.concat(buffers, nread));
}

Expand Down
26 changes: 26 additions & 0 deletions test/parallel/test-zlib-empty-buffer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
'use strict';
const common = require('../common');
const zlib = require('zlib');
const { inspect, promisify } = require('util');
const assert = require('assert');
const emptyBuffer = new Buffer(0);

common.crashOnUnhandledRejection();

(async function() {
for (const [ compress, decompress, method ] of [
[ zlib.deflateRawSync, zlib.inflateRawSync, 'raw sync' ],
[ zlib.deflateSync, zlib.inflateSync, 'deflate sync' ],
[ zlib.gzipSync, zlib.gunzipSync, 'gzip sync' ],
[ promisify(zlib.deflateRaw), promisify(zlib.inflateRaw), 'raw' ],
[ promisify(zlib.deflate), promisify(zlib.inflate), 'deflate' ],
[ promisify(zlib.gzip), promisify(zlib.gunzip), 'gzip' ]
]) {
const compressed = await compress(emptyBuffer);
const decompressed = await decompress(compressed);
assert.deepStrictEqual(
emptyBuffer, decompressed,
`Expected ${inspect(compressed)} to match ${inspect(decompressed)} ` +
`to match for ${method}`);
}
})();

0 comments on commit 74afe5c

Please sign in to comment.