René's URL Explorer Experiment


Title: `fs.ReadFile` throws asynchronously with encoding on large enough input · Issue #2767 · nodejs/node · GitHub

Open Graph Title: `fs.ReadFile` throws asynchronously with encoding on large enough input · Issue #2767 · nodejs/node

X Title: `fs.ReadFile` throws asynchronously with encoding on large enough input · Issue #2767 · nodejs/node

Description: Given 'utf8' encoding is specified, and a large enough input file, fs.ReadFile will throw an asynchronous error. Example program var fs = require('fs'); fs.readFile('data.txt', 'utf8', function(err, data) { console.log(err, data && data....

Open Graph Description: Given 'utf8' encoding is specified, and a large enough input file, fs.ReadFile will throw an asynchronous error. Example program var fs = require('fs'); fs.readFile('data.txt', 'utf8', function(err...

X Description: Given 'utf8' encoding is specified, and a large enough input file, fs.ReadFile will throw an asynchronous error. Example program var fs = require('fs'); fs.readFile('data.txt...

Opengraph URL: https://github.com/nodejs/node/issues/2767

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"`fs.ReadFile` throws asynchronously with encoding on large enough input","articleBody":"Given 'utf8' encoding is specified, and a large enough input file, `fs.ReadFile` will throw an asynchronous error.\n#### Example program\n\n``` js\nvar fs = require('fs');\nfs.readFile('data.txt', 'utf8', function(err, data) {\n  console.log(err, data \u0026\u0026 data.length)\n})\n```\n#### Input: 268 megabytes of data\n\nSuccess.\n\n```\n\u003e dd if=/dev/zero of=data.txt  bs=1000000  count=268\n\u003e node -e \"fs = require('fs'); fs.readFile('data.txt', 'utf8', (err, data) =\u003e console.log(err, data \u0026\u0026 data.length))\"\nnull 268000000\n```\n#### Input: 269 megabytes of data\n\nNo Success.\nWorse, the error isn't forwarded to the callback – the process is throwing asynchronously.\n\n``` js\n\u003e dd if=/dev/zero of=data.txt  bs=1000000  count=269\n\u003e node -e \"fs = require('fs'); fs.readFile('data.txt', 'utf8', (err, data) =\u003e console.log(err, data \u0026\u0026 data.length))\"\nbuffer.js:359\n    throw new Error('toString failed');\n    ^\n\nError: toString failed\n    at Buffer.toString (buffer.js:359:11)\n    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:378:21)\n```\n\nThe error is not something specific to `fs.readFile` though, the same error is produced if we `toString` on the buffer directly, without the 'utf8' parameter, unsurprisingly. The problem is the uncatchable throw.\n\n``` js\n\u003e node -e \"fs = require('fs'); fs.readFile('data.txt', (err, data) =\u003e console.log(err, String(data).length))\"\n```\n\nWhile perhaps the throw in the `Buffer.prototype.toString` makes sense:\n\n``` js\nBuffer.prototype.toString = function() {\n  if (arguments.length === 0) {\n    var result = this.utf8Slice(0, this.length);\n  } else {\n    var result = slowToString.apply(this, arguments);\n  }\n  if (result === undefined)\n    throw new Error('toString failed');\n  return result;\n};\n```\n\nhttps://github.com/nodejs/node/blob/f8152df5e815c98be702fe58753258b58f02c4ad/lib/buffer.js#L352-L361\n\nIt does seem like poor behaviour to have uncatchable errors being thrown in core APIs where **the user has explicitly attached an errback**.\n\nWould a `try…catch` around the `buffer = buffer.toString(context.encoding);` in `fs.ReadFile` be appropriate?\n\n``` js\nfunction readFileAfterClose(err) {\n  var context = this.context;\n  var buffer = null;\n  var callback = context.callback;\n\n  if (context.err)\n    return callback(context.err);\n\n  if (context.size === 0)\n    buffer = Buffer.concat(context.buffers, context.pos);\n  else if (context.pos \u003c context.size)\n    buffer = context.buffer.slice(0, context.pos);\n  else\n    buffer = context.buffer;\n\n  // maybe ?\n  if (context.encoding) {\n    try {\n      buffer = buffer.toString(context.encoding); // currently this line is not wrapped in a try/catch\n    } catch (e) {\n      if (!err) err = e; // which error gets priority?\n    }\n  }\n\n  callback(err, buffer);\n}\n```\n\nhttps://github.com/nodejs/node/blob/f8152df5e815c98be702fe58753258b58f02c4ad/lib/fs.js#L377-L378\n\n`fs.readFile` is understandably hot code, I haven't done benchmarking on the impact of a `try…catch` here.\n\nGiven that there appears to be an upper limit to what can be stringified safely, perhaps the max length could be tested for before attempting the stringification, and a 'this is too big' Error would ideally pop out of the callback.\n\nSuggest at a minimum a more helpful error message \"our buffering is good but have you tried the streams?\"\n","author":{"url":"https://github.com/timoxley","@type":"Person","name":"timoxley"},"datePublished":"2015-09-09T11:19:53.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":13},"url":"https://github.com/2767/node/issues/2767"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:417bc0ee-d710-fcd8-687a-082ab6335775
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idEC7C:3D0120:1356C49:1AF7404:6A4DEBD5
html-safe-nonce7fad25a64c7fd25a12e2d80160886d6d7cdfc89efd71d606da27fb29aa253a9b
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFQzdDOjNEMDEyMDoxMzU2QzQ5OjFBRjc0MDQ6NkE0REVCRDUiLCJ2aXNpdG9yX2lkIjoiMTY3ODUyNzIyMTY4NDEwNDE0OSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacd4815a933e2d6908d42f660b86382b1c7cc077d5b66b7882a713bd789d8620e1
hovercard-subject-tagissue:105576717
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/2767/issue_layout
twitter:imagehttps://opengraph.githubassets.com/f2126a45f5270b255ea3b2764eaffa241da0df2b525b8157c16a344a86504aa3/nodejs/node/issues/2767
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/f2126a45f5270b255ea3b2764eaffa241da0df2b525b8157c16a344a86504aa3/nodejs/node/issues/2767
og:image:altGiven 'utf8' encoding is specified, and a large enough input file, fs.ReadFile will throw an asynchronous error. Example program var fs = require('fs'); fs.readFile('data.txt', 'utf8', function(err...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernametimoxley
hostnamegithub.com
expected-hostnamegithub.com
None06b8a6144231bf3a234f1c2e9993861e07ce98a905912b114aa386c2d7e84b33
turbo-cache-controlno-preview
go-importgithub.com/nodejs/node git https://github.com/nodejs/node.git
octolytics-dimension-user_id9950313
octolytics-dimension-user_loginnodejs
octolytics-dimension-repository_id27193779
octolytics-dimension-repository_nwonodejs/node
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id27193779
octolytics-dimension-repository_network_root_nwonodejs/node
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release1d344bdb7547fe6bca17a59bb2b8aac3dc9532a0
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/nodejs/node/issues/2767#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fissues%2F2767
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fissues%2F2767
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=nodejs%2Fnode
Reloadhttps://github.com/nodejs/node/issues/2767
Reloadhttps://github.com/nodejs/node/issues/2767
Reloadhttps://github.com/nodejs/node/issues/2767
Please reload this pagehttps://github.com/nodejs/node/issues/2767
nodejs https://github.com/nodejs
nodehttps://github.com/nodejs/node
Please reload this pagehttps://github.com/nodejs/node/issues/2767
Notifications https://github.com/login?return_to=%2Fnodejs%2Fnode
Fork 36k https://github.com/login?return_to=%2Fnodejs%2Fnode
Star 118k https://github.com/login?return_to=%2Fnodejs%2Fnode
Code https://github.com/nodejs/node
Issues 1.3k https://github.com/nodejs/node/issues
Pull requests 963 https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality 0 https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
Code https://github.com/nodejs/node
Issues https://github.com/nodejs/node/issues
Pull requests https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
fs.ReadFile throws asynchronously with encoding on large enough inputhttps://github.com/nodejs/node/issues/2767#top
fsIssues and PRs related to the fs subsystem / file system.https://github.com/nodejs/node/issues?q=state%3Aopen%20label%3A%22fs%22
https://github.com/timoxley
timoxleyhttps://github.com/timoxley
on Sep 9, 2015https://github.com/nodejs/node/issues/2767#issue-105576717
node/lib/buffer.jshttps://github.com/nodejs/node/blob/f8152df5e815c98be702fe58753258b58f02c4ad/lib/buffer.js#L352-L361
f8152dfhttps://github.com/nodejs/node/commit/f8152df5e815c98be702fe58753258b58f02c4ad
node/lib/fs.jshttps://github.com/nodejs/node/blob/f8152df5e815c98be702fe58753258b58f02c4ad/lib/fs.js#L377-L378
f8152dfhttps://github.com/nodejs/node/commit/f8152df5e815c98be702fe58753258b58f02c4ad
fsIssues and PRs related to the fs subsystem / file system.https://github.com/nodejs/node/issues?q=state%3Aopen%20label%3A%22fs%22
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.