Permalink
Browse files

stream: fix highWaterMark integer overflow

Fixes integer overflows when supplying values exceeding MAX_SAFE_INTEGER
for highWaterMark.

PR-URL: #12593
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Luca Maraschi <luca.maraschi@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information...
tniessen authored and mcollina committed May 10, 2017
1 parent 7906ed5 commit 11918c4aedd27c0ed6b5f029fb2a50c889530db5
Showing with 20 additions and 2 deletions.
  1. +1 −1 lib/_stream_readable.js
  2. +1 −1 lib/_stream_writable.js
  3. +18 −0 test/parallel/test-streams-highwatermark.js
View
@@ -72,7 +72,7 @@ function ReadableState(options, stream) {
this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;
// cast to ints.
this.highWaterMark = ~~this.highWaterMark;
this.highWaterMark = Math.floor(this.highWaterMark);
// A linked list is used to store data chunks instead of an array because the
// linked list can remove elements from the beginning faster than
View
@@ -55,7 +55,7 @@ function WritableState(options, stream) {
this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;
// cast to ints.
this.highWaterMark = ~~this.highWaterMark;
this.highWaterMark = Math.floor(this.highWaterMark);
// drain event flag.
this.needDrain = false;
@@ -0,0 +1,18 @@
'use strict';
require('../common');
// This test ensures that the stream implementation correctly handles values
// for highWaterMark which exceed the range of signed 32 bit integers.
const assert = require('assert');
const stream = require('stream');
// This number exceeds the range of 32 bit integer arithmetic but should still
// be handled correctly.
const ovfl = Number.MAX_SAFE_INTEGER;
const readable = stream.Readable({ highWaterMark: ovfl });
assert.strictEqual(readable._readableState.highWaterMark, ovfl);
const writable = stream.Writable({ highWaterMark: ovfl });
assert.strictEqual(writable._writableState.highWaterMark, ovfl);

0 comments on commit 11918c4

Please sign in to comment.