diff --git a/lib/fs.js b/lib/fs.js index 847de4dbb87..32a0ea8a49d 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -472,7 +472,11 @@ function readFileAfterStat(err) { return context.close(err); } - context.buffer = Buffer.allocUnsafeSlow(size); + try { + context.buffer = Buffer.allocUnsafeSlow(size); + } catch (err) { + return context.close(err); + } context.read(); } @@ -507,27 +511,21 @@ function readFileAfterClose(err) { if (context.err || err) return callback(context.err || err); - if (context.size === 0) - buffer = Buffer.concat(context.buffers, context.pos); - else if (context.pos < context.size) - buffer = context.buffer.slice(0, context.pos); - else - buffer = context.buffer; - - if (context.encoding) { - return tryToString(buffer, context.encoding, callback); - } - - callback(null, buffer); -} - -function tryToString(buf, encoding, callback) { try { - buf = buf.toString(encoding); + if (context.size === 0) + buffer = Buffer.concat(context.buffers, context.pos); + else if (context.pos < context.size) + buffer = context.buffer.slice(0, context.pos); + else + buffer = context.buffer; + + if (context.encoding) + buffer = buffer.toString(context.encoding); } catch (err) { return callback(err); } - callback(null, buf); + + callback(null, buffer); } function tryStatSync(fd, isUserFd) { diff --git a/test/sequential/test-fs-readfile-tostring-fail.js b/test/sequential/test-fs-readfile-tostring-fail.js index 2eb6ce0732d..62c855de864 100644 --- a/test/sequential/test-fs-readfile-tostring-fail.js +++ b/test/sequential/test-fs-readfile-tostring-fail.js @@ -29,7 +29,8 @@ stream.on('finish', common.mustCall(function() { // make sure that the toString does not throw an error fs.readFile(file, 'utf8', common.mustCall(function(err, buf) { assert.ok(err instanceof Error); - assert.strictEqual('"toString()" failed', err.message); + assert(/^(Array buffer allocation failed|"toString\(\)" failed)$/ + .test(err.message)); assert.strictEqual(buf, undefined); })); }));