From: cjihrig Date: Wed, 18 Feb 2015 17:55:13 +0000 (-0500) Subject: fs: add type checking to makeCallback() X-Git-Tag: v1.4.1~33 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1f40b2a63616efe0e4c0744a1f630161526e4236;p=platform%2Fupstream%2Fnodejs.git fs: add type checking to makeCallback() This commit adds proper type checking to makeCallback(). Anything other than undefined or a function will throw. PR-URL: https://github.com/iojs/io.js/pull/866 Reviewed-By: Ben Noordhuis Reviewed-By: Vladimir Kurchatkin --- diff --git a/lib/fs.js b/lib/fs.js index d4f7708..b2aba37 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -65,10 +65,14 @@ function maybeCallback(cb) { // for callbacks that are passed to the binding layer, callbacks that are // invoked from JS already run in the proper scope. function makeCallback(cb) { - if (typeof cb !== 'function') { + if (cb === undefined) { return rethrow(); } + if (typeof cb !== 'function') { + throw new TypeError('callback must be a function'); + } + return function() { return cb.apply(null, arguments); }; diff --git a/test/parallel/test-fs-make-callback.js b/test/parallel/test-fs-make-callback.js new file mode 100644 index 0000000..9199001 --- /dev/null +++ b/test/parallel/test-fs-make-callback.js @@ -0,0 +1,27 @@ +var common = require('../common'); +var assert = require('assert'); +var fs = require('fs'); + +function test(cb) { + return function() { + // fs.stat() calls makeCallback() on its second argument + fs.stat(__filename, cb); + }; +} + +// Verify the case where a callback function is provided +assert.doesNotThrow(test(function() {})); + +// Passing undefined calls rethrow() internally, which is fine +assert.doesNotThrow(test(undefined)); + +// Anything else should throw +assert.throws(test(null)); +assert.throws(test(true)); +assert.throws(test(false)); +assert.throws(test(1)); +assert.throws(test(0)); +assert.throws(test('foo')); +assert.throws(test(/foo/)); +assert.throws(test([])); +assert.throws(test({}));