| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 203b548 commit 241eb61
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -458,9 +458,13 @@ added: v0.5.8 | |||
| 458 | 458 | ||
| 459 | 459 | Creates and returns a new [DeflateRaw][] object with the given [options][]. | |
| 460 | 460 | ||
| 461 | - *Note*: The zlib library rejects requests for 256-byte windows (i.e., | ||
| 462 | - `{ windowBits: 8 }` in `options`). An `Error` will be thrown when creating | ||
| 463 | - a [DeflateRaw][] object with this specific value of the `windowBits` option. | ||
| 461 | + *Note*: An upgrade of zlib from 1.2.8 to 1.2.11 changed behavior when windowBits | ||
| 462 | + is set to 8 for raw deflate streams. zlib does not have a working implementation | ||
| 463 | + of an 8-bit Window for raw deflate streams and would automatically set windowBit | ||
| 464 | + to 9 if initially set to 8. Newer versions of zlib will throw an exception. | ||
| 465 | + This creates a potential DOS vector, and as such the behavior ahs been reverted | ||
| 466 | + in Node.js 8, 6, and 4. Node.js version 9 and higher will throw when windowBits | ||
| 467 | + is set to 8. | ||
| 464 | 468 | ||
| 465 | 469 | ## zlib.createGunzip([options]) | |
| 466 | 470 | <!-- YAML | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -619,6 +619,7 @@ function Gunzip(opts) { | |||
| 619 | 619 | inherits(Gunzip, Zlib); | |
| 620 | 620 | ||
| 621 | 621 | function DeflateRaw(opts) { | |
| 622 | + if (opts && opts.windowBits === 8) opts.windowBits = 9; | ||
| 622 | 623 | if (!(this instanceof DeflateRaw)) | |
| 623 | 624 | return new DeflateRaw(opts); | |
| 624 | 625 | Zlib.call(this, opts, DEFLATERAW); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5,23 +5,6 @@ const common = require('../common'); | |||
| 5 | 5 | const assert = require('assert'); | |
| 6 | 6 | const zlib = require('zlib'); | |
| 7 | 7 | ||
| 8 | - // For raw deflate encoding, requests for 256-byte windows are rejected as | ||
| 9 | - // invalid by zlib (http://zlib.net/manual.html#Advanced). | ||
| 10 | - // This check was introduced in version 1.2.9 and prior to that there was | ||
| 11 | - // no such rejection which is the reason for the version check below | ||
| 12 | - // (http://zlib.net/ChangeLog.txt). | ||
| 13 | - if (!/^1\.2\.[0-8]$/.test(process.versions.zlib)) { | ||
| 14 | - common.expectsError( | ||
| 15 | - () => zlib.createDeflateRaw({ windowBits: 8 }), | ||
| 16 | - { | ||
| 17 | - code: 'ERR_ZLIB_INITIALIZATION_FAILED', | ||
| 18 | - type: Error, | ||
| 19 | - message: 'Initialization failed' | ||
| 20 | - }); | ||
| 21 | - } | ||
| 22 | - | ||
| 23 | - // Regression tests for bugs in the validation logic. | ||
| 24 | - | ||
| 25 | 8 | common.expectsError( | |
| 26 | 9 | () => zlib.createGzip({ chunkSize: 0 }), | |
| 27 | 10 | { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -24,6 +24,7 @@ const common = require('../common'); | |||
| 24 | 24 | const assert = require('assert'); | |
| 25 | 25 | const zlib = require('zlib'); | |
| 26 | 26 | const stream = require('stream'); | |
| 27 | + const fs = require('fs'); | ||
| 27 | 28 | const fixtures = require('../common/fixtures'); | |
| 28 | 29 | ||
| 29 | 30 | let zlibPairs = [ | |
@@ -150,6 +151,28 @@ class SlowStream extends stream.Stream { | |||
| 150 | 151 | } | |
| 151 | 152 | } | |
| 152 | 153 | ||
| 154 | + // windowBits: 8 shouldn't throw | ||
| 155 | + assert.doesNotThrow(() => { | ||
| 156 | + zlib.createDeflateRaw({ windowBits: 8 }); | ||
| 157 | + }, 'windowsBits set to 8 should follow legacy zlib behavior'); | ||
| 158 | + | ||
| 159 | + { | ||
| 160 | + const node = fs.createReadStream(process.execPath); | ||
| 161 | + const raw = []; | ||
| 162 | + const reinflated = []; | ||
| 163 | + node.on('data', (chunk) => raw.push(chunk)); | ||
| 164 | + | ||
| 165 | + // Usually, the inflate windowBits parameter needs to be at least the | ||
| 166 | + // value of the matching deflate’s windowBits. However, inflate raw with | ||
| 167 | + // windowBits = 8 should be able to handle compressed data from a source | ||
| 168 | + // that does not know about the silent 8-to-9 upgrade of windowBits | ||
| 169 | + // that older versions of zlib/Node perform. | ||
| 170 | + node.pipe(zlib.createDeflateRaw({ windowBits: 9 })) | ||
| 171 | + .pipe(zlib.createInflateRaw({ windowBits: 8 })) | ||
| 172 | + .on('data', (chunk) => reinflated.push(chunk)) | ||
| 173 | + .on('end', common.mustCall( | ||
| 174 | + () => assert(Buffer.concat(raw).equals(Buffer.concat(reinflated))))); | ||
| 175 | + } | ||
| 153 | 176 | ||
| 154 | 177 | // for each of the files, make sure that compressing and | |
| 155 | 178 | // decompressing results in the same data, for every combination | |
| Back | FazBrowse Home | New Git URL |
0 commit comments