diff options
author | isaacs <i@izs.me> | 2012-12-07 16:50:12 -0800 |
---|---|---|
committer | isaacs <i@izs.me> | 2012-12-07 16:52:46 -0800 |
commit | 33fa7405778444ca66470ab0729e6fa9fe43d2a6 (patch) | |
tree | dfd40743731897b42211779d2485227dc0fd6f0e /lib/fs.js | |
parent | 5b65638124233e914f523af4c09f391d1ad969c1 (diff) | |
download | nodejs-33fa7405778444ca66470ab0729e6fa9fe43d2a6.tar.gz nodejs-33fa7405778444ca66470ab0729e6fa9fe43d2a6.tar.bz2 nodejs-33fa7405778444ca66470ab0729e6fa9fe43d2a6.zip |
fs: Raise error when null bytes detected in paths
Reworking of @bnoordhuis's more aggressive approach.
Diffstat (limited to 'lib/fs.js')
-rw-r--r-- | lib/fs.js | 97 |
1 files changed, 83 insertions, 14 deletions
@@ -98,6 +98,18 @@ function assertEncoding(encoding) { } } +function nullCheck(path, callback) { + if (('' + path).indexOf('\u0000') !== -1) { + var er = new Error('Path must be a string without null bytes.'); + if (!callback) + throw er; + process.nextTick(function() { + callback(er); + }); + return false; + } + return true; +} fs.Stats = binding.Stats; @@ -134,13 +146,16 @@ fs.Stats.prototype.isSocket = function() { }; fs.exists = function(path, callback) { - binding.stat(pathModule._makeLong(path), function(err, stats) { + if (!nullCheck(path, cb)) return; + binding.stat(pathModule._makeLong(path), cb); + function cb(err, stats) { if (callback) callback(err ? false : true); - }); + } }; fs.existsSync = function(path) { try { + nullCheck(path); binding.stat(pathModule._makeLong(path)); return true; } catch (e) { @@ -362,6 +377,7 @@ fs.open = function(path, flags, mode, callback) { callback = makeCallback(arguments[arguments.length - 1]); mode = modeNum(mode, 438 /*=0666*/); + if (!nullCheck(path, callback)) return; binding.open(pathModule._makeLong(path), stringToFlags(flags), mode, @@ -370,6 +386,7 @@ fs.open = function(path, flags, mode, callback) { fs.openSync = function(path, flags, mode) { mode = modeNum(mode, 438 /*=0666*/); + nullCheck(path); return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); }; @@ -475,12 +492,17 @@ fs.writeSync = function(fd, buffer, offset, length, position) { }; fs.rename = function(oldPath, newPath, callback) { + callback = makeCallback(callback); + if (!nullCheck(oldPath, callback)) return; + if (!nullCheck(newPath, callback)) return; binding.rename(pathModule._makeLong(oldPath), pathModule._makeLong(newPath), - makeCallback(callback)); + callback); }; fs.renameSync = function(oldPath, newPath) { + nullCheck(oldPath); + nullCheck(newPath); return binding.rename(pathModule._makeLong(oldPath), pathModule._makeLong(newPath)); }; @@ -543,10 +565,13 @@ fs.ftruncateSync = function(fd, len) { }; fs.rmdir = function(path, callback) { - binding.rmdir(pathModule._makeLong(path), makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.rmdir(pathModule._makeLong(path), callback); }; fs.rmdirSync = function(path) { + nullCheck(path); return binding.rmdir(pathModule._makeLong(path)); }; @@ -568,12 +593,15 @@ fs.fsyncSync = function(fd) { fs.mkdir = function(path, mode, callback) { if (typeof mode === 'function') callback = mode; + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; binding.mkdir(pathModule._makeLong(path), modeNum(mode, 511 /*=0777*/), - makeCallback(callback)); + callback); }; fs.mkdirSync = function(path, mode) { + nullCheck(path); return binding.mkdir(pathModule._makeLong(path), modeNum(mode, 511 /*=0777*/)); }; @@ -587,10 +615,13 @@ fs.sendfileSync = function(outFd, inFd, inOffset, length) { }; fs.readdir = function(path, callback) { - binding.readdir(pathModule._makeLong(path), makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.readdir(pathModule._makeLong(path), callback); }; fs.readdirSync = function(path) { + nullCheck(path); return binding.readdir(pathModule._makeLong(path)); }; @@ -599,11 +630,15 @@ fs.fstat = function(fd, callback) { }; fs.lstat = function(path, callback) { - binding.lstat(pathModule._makeLong(path), makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.lstat(pathModule._makeLong(path), callback); }; fs.stat = function(path, callback) { - binding.stat(pathModule._makeLong(path), makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.stat(pathModule._makeLong(path), callback); }; fs.fstatSync = function(fd) { @@ -611,18 +646,23 @@ fs.fstatSync = function(fd) { }; fs.lstatSync = function(path) { + nullCheck(path); return binding.lstat(pathModule._makeLong(path)); }; fs.statSync = function(path) { + nullCheck(path); return binding.stat(pathModule._makeLong(path)); }; fs.readlink = function(path, callback) { - binding.readlink(pathModule._makeLong(path), makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.readlink(pathModule._makeLong(path), callback); }; fs.readlinkSync = function(path) { + nullCheck(path); return binding.readlink(pathModule._makeLong(path)); }; @@ -643,6 +683,9 @@ fs.symlink = function(destination, path, type_, callback) { var type = (typeof type_ === 'string' ? type_ : null); var callback = makeCallback(arguments[arguments.length - 1]); + if (!nullCheck(destination, callback)) return; + if (!nullCheck(path, callback)) return; + binding.symlink(preprocessSymlinkDestination(destination, type), pathModule._makeLong(path), type, @@ -652,27 +695,39 @@ fs.symlink = function(destination, path, type_, callback) { fs.symlinkSync = function(destination, path, type) { type = (typeof type === 'string' ? type : null); + nullCheck(destination); + nullCheck(path); + return binding.symlink(preprocessSymlinkDestination(destination, type), pathModule._makeLong(path), type); }; fs.link = function(srcpath, dstpath, callback) { + callback = makeCallback(callback); + if (!nullCheck(srcpath, callback)) return; + if (!nullCheck(dstpath, callback)) return; + binding.link(pathModule._makeLong(srcpath), pathModule._makeLong(dstpath), - makeCallback(callback)); + callback); }; fs.linkSync = function(srcpath, dstpath) { + nullCheck(srcpath); + nullCheck(dstpath); return binding.link(pathModule._makeLong(srcpath), pathModule._makeLong(dstpath)); }; fs.unlink = function(path, callback) { - binding.unlink(pathModule._makeLong(path), makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.unlink(pathModule._makeLong(path), callback); }; fs.unlinkSync = function(path) { + nullCheck(path); return binding.unlink(pathModule._makeLong(path)); }; @@ -725,12 +780,15 @@ if (constants.hasOwnProperty('O_SYMLINK')) { fs.chmod = function(path, mode, callback) { + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; binding.chmod(pathModule._makeLong(path), modeNum(mode), - makeCallback(callback)); + callback); }; fs.chmodSync = function(path, mode) { + nullCheck(path); return binding.chmod(pathModule._makeLong(path), modeNum(mode)); }; @@ -761,10 +819,13 @@ fs.fchownSync = function(fd, uid, gid) { }; fs.chown = function(path, uid, gid, callback) { - binding.chown(pathModule._makeLong(path), uid, gid, makeCallback(callback)); + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; + binding.chown(pathModule._makeLong(path), uid, gid, callback); }; fs.chownSync = function(path, uid, gid) { + nullCheck(path); return binding.chown(pathModule._makeLong(path), uid, gid); }; @@ -784,13 +845,16 @@ function toUnixTimestamp(time) { fs._toUnixTimestamp = toUnixTimestamp; fs.utimes = function(path, atime, mtime, callback) { + callback = makeCallback(callback); + if (!nullCheck(path, callback)) return; binding.utimes(pathModule._makeLong(path), toUnixTimestamp(atime), toUnixTimestamp(mtime), - makeCallback(callback)); + callback); }; fs.utimesSync = function(path, atime, mtime) { + nullCheck(path); atime = toUnixTimestamp(atime); mtime = toUnixTimestamp(mtime); binding.utimes(pathModule._makeLong(path), atime, mtime); @@ -929,6 +993,7 @@ function FSWatcher() { util.inherits(FSWatcher, EventEmitter); FSWatcher.prototype.start = function(filename, persistent) { + nullCheck(filename); var r = this._handle.start(pathModule._makeLong(filename), persistent); if (r) { @@ -942,6 +1007,7 @@ FSWatcher.prototype.close = function() { }; fs.watch = function(filename) { + nullCheck(filename); var watcher; var options; var listener; @@ -996,6 +1062,7 @@ util.inherits(StatWatcher, EventEmitter); StatWatcher.prototype.start = function(filename, persistent, interval) { + nullCheck(filename); this._handle.start(pathModule._makeLong(filename), persistent, interval); }; @@ -1013,6 +1080,7 @@ function inStatWatchers(filename) { fs.watchFile = function(filename) { + nullCheck(filename); var stat; var listener; @@ -1046,6 +1114,7 @@ fs.watchFile = function(filename) { }; fs.unwatchFile = function(filename, listener) { + nullCheck(filename); if (!inStatWatchers(filename)) return; var stat = statWatchers[filename]; |