From 4442dfe727d89f86f3059c525a4c6104bc49d27b Mon Sep 17 00:00:00 2001 From: yorkie Date: Sun, 16 Aug 2015 00:30:31 +0800 Subject: [PATCH] fs: consider NaN/Infinity in toUnixTimestamp --- doc/api/fs.markdown | 7 +++++++ lib/fs.js | 6 ++++++ test/parallel/test-fs-utimes.js | 8 +++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown index ebc2046d76ac1e..6bbcc70b14a42f 100644 --- a/doc/api/fs.markdown +++ b/doc/api/fs.markdown @@ -363,6 +363,13 @@ descriptor. Change file timestamps of the file referenced by the supplied path. +Note: the arguments `atime` and `mtime` of the following related functions does follow the +below rules: + +- If the value is a numberable string like "123456789", the value would get converted to + corresponding number. +- If the value is `NaN` or `Infinity`, the value would get converted to `Date.now()`. + ## fs.utimesSync(path, atime, mtime) Synchronous version of `fs.utimes()`. Returns `undefined`. diff --git a/lib/fs.js b/lib/fs.js index 138a90e2f2ecd5..160d954b139cbb 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -1045,7 +1045,13 @@ fs.chownSync = function(path, uid, gid) { // converts Date or number to a fractional UNIX timestamp function toUnixTimestamp(time) { + if (typeof time === 'string' && +time == time) { + return +time; + } if (typeof time === 'number') { + if (!Number.isFinite(time) || time < 0) { + return Date.now() / 1000; + } return time; } if (util.isDate(time)) { diff --git a/test/parallel/test-fs-utimes.js b/test/parallel/test-fs-utimes.js index 292636b1b69108..a5ec0b2c2e2f8f 100644 --- a/test/parallel/test-fs-utimes.js +++ b/test/parallel/test-fs-utimes.js @@ -122,16 +122,22 @@ function runTest(atime, mtime, callback) { var stats = fs.statSync(__filename); +// run tests runTest(new Date('1982-09-10 13:37'), new Date('1982-09-10 13:37'), function() { runTest(new Date(), new Date(), function() { runTest(123456.789, 123456.789, function() { runTest(stats.mtime, stats.mtime, function() { - // done + runTest(NaN, Infinity, function() { + runTest('123456', -1, function() { + // done + }); + }); }); }); }); }); + process.on('exit', function() { console.log('Tests run / ok:', tests_run, '/', tests_ok); assert.equal(tests_ok, tests_run);