fs: add type checking to makeCallback()
authorcjihrig <cjihrig@gmail.com>
Wed, 18 Feb 2015 17:55:13 +0000 (12:55 -0500)
committercjihrig <cjihrig@gmail.com>
Sat, 21 Feb 2015 17:13:43 +0000 (12:13 -0500)
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 <info@bnoordhuis.nl>
Reviewed-By: Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
lib/fs.js
test/parallel/test-fs-make-callback.js [new file with mode: 0644]

index d4f7708..b2aba37 100644 (file)
--- 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 (file)
index 0000000..9199001
--- /dev/null
@@ -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({}));