diff --git a/lib/fs.js b/lib/fs.js index 1a76564e07..3e95b9c884 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -1125,8 +1125,13 @@ var ReadStream = fs.ReadStream = function(path, options) { if (this.encoding) this.setEncoding(this.encoding); if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } if (this.end === undefined) { this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); } if (this.start > this.end) { @@ -1313,6 +1318,9 @@ var WriteStream = fs.WriteStream = function(path, options) { } if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } if (this.start < 0) { throw new Error('start must be >= zero'); } diff --git a/test/simple/test-fs-non-number-arguments-throw.js b/test/simple/test-fs-non-number-arguments-throw.js new file mode 100644 index 0000000000..7a1e7bdb52 --- /dev/null +++ b/test/simple/test-fs-non-number-arguments-throw.js @@ -0,0 +1,24 @@ +var assert = require('assert'), + fs = require('fs'), + saneEmitter, + sanity = 'ire(\'assert\')'; + +saneEmitter = fs.createReadStream(__filename, { start: 17, end: 29 }); + +assert.throws(function () { + fs.createReadStream(__filename, { start: "17", end: 29 }); +}, "start as string didn't throw an error for createReadStream"); + +assert.throws(function () { + fs.createReadStream(__filename, { start: 17, end: "29" }); +}, "end as string didn't throw an error"); + +assert.throws(function () { + fs.createWriteStream(__filename, { start: "17" }); +}, "start as string didn't throw an error for createWriteStream"); + +saneEmitter.on('data', function (data) { + // a sanity check when using numbers instead of strings + assert.strictEqual(sanity, data.toString('utf8'), 'read ' + + data.toString('utf8') + ' instead of ' + sanity); +});