From bd61cdd43394a51463216b874612c62eb2f0024a Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Thu, 5 Mar 2015 18:33:38 +0100 Subject: [PATCH 1/3] fs: use stat.st_size only to read regular files - Using st_size to read other kind of files can lead to not reading all the data. --- lib/fs.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index 9828b3099cf668..adcb708021cb23 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -317,7 +317,7 @@ function readFileAfterStat(err, st) { if (err) return context.close(err); - var size = context.size = st.size; + var size = context.size = st.isFile() ? st.size : 0; if (size === 0) { context.buffers = []; @@ -395,10 +395,12 @@ fs.readFileSync = function(path, options) { var flag = options.flag || 'r'; var fd = fs.openSync(path, flag, 0o666); + var st; var size; var threw = true; try { - size = fs.fstatSync(fd).size; + st = fs.fstatSync(fd); + size = st.isFile() ? st.size : 0; threw = false; } finally { if (threw) fs.closeSync(fd); From b176d5cf986df2e7eb01143037e0f369e6458306 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Fri, 6 Mar 2015 14:08:29 +0100 Subject: [PATCH 2/3] test: tests for read large files through a pipe --- test/parallel/test-fs-readfile-pipe-large.js | 41 +++++++++++++++++++ .../test-fs-readfilesync-pipe-large.js | 38 +++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 test/parallel/test-fs-readfile-pipe-large.js create mode 100644 test/parallel/test-fs-readfilesync-pipe-large.js diff --git a/test/parallel/test-fs-readfile-pipe-large.js b/test/parallel/test-fs-readfile-pipe-large.js new file mode 100644 index 00000000000000..3502cdd5f48778 --- /dev/null +++ b/test/parallel/test-fs-readfile-pipe-large.js @@ -0,0 +1,41 @@ +var common = require('../common'); +var assert = require('assert'); +var path = require('path'); + +// simulate `cat readfile.js | node readfile.js` + +// TODO: Have some way to make this work on windows. +if (process.platform === 'win32') { + console.error('No /dev/stdin on windows. Skipping test.'); + process.exit(); +} + +var fs = require('fs'); + +var filename = path.join(common.tmpDir, '/readfile_pipe_large_test.txt'); +var dataExpected = new Array(1000000).join('a'); +fs.writeFileSync(filename, dataExpected); + +if (process.argv[2] === 'child') { + fs.readFile('/dev/stdin', function(er, data) { + if (er) throw er; + process.stdout.write(data); + }); + return; +} + +var exec = require('child_process').exec; +var f = JSON.stringify(__filename); +var node = JSON.stringify(process.execPath); +var cmd = 'cat ' + filename + ' | ' + node + ' ' + f + ' child'; +exec(cmd, { maxBuffer: 1000000 }, function(err, stdout, stderr) { + if (err) console.error(err); + assert(!err, 'it exits normally'); + assert(stdout === dataExpected, 'it reads the file and outputs it'); + assert(stderr === '', 'it does not write to stderr'); + console.log('ok'); +}); + +process.on('exit', function() { + fs.unlinkSync(filename); +}); diff --git a/test/parallel/test-fs-readfilesync-pipe-large.js b/test/parallel/test-fs-readfilesync-pipe-large.js new file mode 100644 index 00000000000000..e62d541a68053c --- /dev/null +++ b/test/parallel/test-fs-readfilesync-pipe-large.js @@ -0,0 +1,38 @@ +var common = require('../common'); +var assert = require('assert'); +var path = require('path'); + +// simulate `cat readfile.js | node readfile.js` + +// TODO: Have some way to make this work on windows. +if (process.platform === 'win32') { + console.error('No /dev/stdin on windows. Skipping test.'); + process.exit(); +} + +var fs = require('fs'); + +var filename = path.join(common.tmpDir, '/readfilesync_pipe_large_test.txt'); +var dataExpected = new Array(1000000).join('a'); +fs.writeFileSync(filename, dataExpected); + +if (process.argv[2] === 'child') { + process.stdout.write(fs.readFileSync('/dev/stdin', 'utf8')); + return; +} + +var exec = require('child_process').exec; +var f = JSON.stringify(__filename); +var node = JSON.stringify(process.execPath); +var cmd = 'cat ' + filename + ' | ' + node + ' ' + f + ' child'; +exec(cmd, { maxBuffer: 1000000 }, function(err, stdout, stderr) { + if (err) console.error(err); + assert(!err, 'it exits normally'); + assert(stdout === dataExpected, 'it reads the file and outputs it'); + assert(stderr === '', 'it does not write to stderr'); + console.log('ok'); +}); + +process.on('exit', function() { + fs.unlinkSync(filename); +}); From dd6313ce5b86388980bd74e284316c07fd51e217 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Thu, 12 Mar 2015 10:46:15 +0100 Subject: [PATCH 3/3] test: fix readfile-zero-byte-liar test --- test/parallel/test-fs-readfile-zero-byte-liar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-fs-readfile-zero-byte-liar.js b/test/parallel/test-fs-readfile-zero-byte-liar.js index c30ff9a1dd75e0..532459305c5d91 100644 --- a/test/parallel/test-fs-readfile-zero-byte-liar.js +++ b/test/parallel/test-fs-readfile-zero-byte-liar.js @@ -17,7 +17,7 @@ fs.fstat = function(fd, cb) { }; fs.fstatSync = function(fd) { - var st = fs._fstatSync; + var st = fs._fstatSync(fd); st.size = 0; return st; };