Title: buffer: indexOf/includes clamp byteOffset to 2^31-1 and return a negative index on buffers over 2 GiB · Issue #67008 · nodejs/node · GitHub
Open Graph Title: buffer: indexOf/includes clamp byteOffset to 2^31-1 and return a negative index on buffers over 2 GiB · Issue #67008 · nodejs/node
X Title: buffer: indexOf/includes clamp byteOffset to 2^31-1 and return a negative index on buffers over 2 GiB · Issue #67008 · nodejs/node
Description: Version v24.22.1 (also v22.23.3) Platform Linux 5.15.167.4-microsoft-standard-WSL2 x86_64 GNU/Linux Subsystem buffer What steps will reproduce the bug? // Buffer.indexOf / includes with a byteOffset above 2^31 - 1 const G = 2 ** 30; cons...
Open Graph Description: Version v24.22.1 (also v22.23.3) Platform Linux 5.15.167.4-microsoft-standard-WSL2 x86_64 GNU/Linux Subsystem buffer What steps will reproduce the bug? // Buffer.indexOf / includes with a byteOffse...
X Description: Version v24.22.1 (also v22.23.3) Platform Linux 5.15.167.4-microsoft-standard-WSL2 x86_64 GNU/Linux Subsystem buffer What steps will reproduce the bug? // Buffer.indexOf / includes with a byteOffse...
Opengraph URL: https://github.com/nodejs/node/issues/67008
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"buffer: indexOf/includes clamp byteOffset to 2^31-1 and return a negative index on buffers over 2 GiB","articleBody":"### Version\n\nv24.22.1 (also v22.23.3)\n\n### Platform\n\n```text\nLinux 5.15.167.4-microsoft-standard-WSL2 x86_64 GNU/Linux\n```\n\n### Subsystem\n\nbuffer\n\n### What steps will reproduce the bug?\n\n```js\n// Buffer.indexOf / includes with a byteOffset above 2^31 - 1\nconst G = 2 ** 30;\nconst buf = Buffer.alloc(3 * G);\nbuf[2.25 * G] = 0x0a; // a newline BEFORE byteOffset\nbuf[2.75 * G] = 0x0a; // the first newline AFTER byteOffset\n\nconst from = 2.5 * G;\nconst got = buf.indexOf(0x0a, from);\nconsole.log(`indexOf(0x0a, ${from}) = ${got} (expected ${2.75 * G})`);\nconsole.log(` returned index \u003c byteOffset: ${got !== -1 && got \u003c from}`);\nconsole.log(`includes(0x0a, ${2.9 * G}) = ${buf.includes(0x0a, 2.9 * G)} (expected false)`);\nconsole.log(`subarray(from).indexOf + from = ${from + buf.subarray(from).indexOf(0x0a)} (correct)`);\n```\n\n### How often does it reproduce? Is there a required condition?\n\nAlways, when the buffer is larger than 2 GiB and `byteOffset` is above `2^31 - 1`.\n\n### What is the expected behavior? Why is that the expected behavior?\n\n```\nindexOf(0x0a, 2684354560) = 2952790016 (expected 2952790016)\n returned index \u003c byteOffset: false\nincludes(0x0a, 3113851289.6) = false (expected false)\n```\n\n`indexOf` should return the first match at or after `byteOffset`, and buffers this size are within `buffer.constants.MAX_LENGTH`.\n\n### What do you see instead?\n\n```\nindexOf(0x0a, 2684354560) = -1879048192 (expected 2952790016)\n returned index \u003c byteOffset: true\nincludes(0x0a, 3113851289.6) = true (expected false)\nsubarray(from).indexOf + from = 2952790016 (correct)\n```\n\n### Additional information\n\nTwo problems combine here:\n\n1. `byteOffset` appears to be clamped to `2^31 - 1`, so the search starts at 2 GiB. It finds the newline at 2.25 GiB, which is before the requested offset, and `includes` returns `true` for a range that has no match.\n2. The returned index is then wrapped to int32: `-1879048192` is `2415919104 - 2^32`, the position of the 2.25 GiB newline. A negative non-`-1` result isn't a valid return value.\n\nSearching a `subarray` gives the right answer, so only the offset argument and the return value are affected.\n\nBun 1.4.4 has the same offset clamp (without the negative return). Reported there separately.\n","author":{"url":"https://github.com/ozonedev27","@type":"Person","name":"ozonedev27"},"datePublished":"2026-10-26T00:16:06Z","url":"https://github.com/nodejs/node/issues/67008"}
| react-profiling | 0 |
| react-import-map | react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf |
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:8babd044-347c-0042-f614-4d648795ef8d |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B2BA:216337:65D238:8A0F0A:6AED2615 |
| html-safe-nonce | 7d473507ee40820843ad313b4f5ca9720c1b8882a0d7f287f83425330b86f280 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMkJBOjIxNjMzNzo2NUQyMzg6OEEwRjBBOjZBRUQyNjE1IiwidmlzaXRvcl9pZCI6Ijg3MjM5NzMwMzI2NzkxMjI0NTMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | f67b66a164d0c98786bbd4c5e7d3e9b9169d5d792b9efd2b0319bafccb1c8275 |
| hovercard-subject-tag | issue:6031007774 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/67008/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f83d7e452dc18debdaf97d694ee4a2280c21e579afad701ba0735736a07da0c9/nodejs/node/issues/67008 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f83d7e452dc18debdaf97d694ee4a2280c21e579afad701ba0735736a07da0c9/nodejs/node/issues/67008 |
| og:image:alt | Version v24.22.1 (also v22.23.3) Platform Linux 5.15.167.4-microsoft-standard-WSL2 x86_64 GNU/Linux Subsystem buffer What steps will reproduce the bug? // Buffer.indexOf / includes with a byteOffse... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | ozonedev27 |
| hostname | github.com |
| expected-hostname | github.com |
| None | 9d95365dda0576efe9b71f45807595e396bd0ca9286fba5367a05048e6ddf8f2 |
| turbo-cache-control | no-preview |
| go-import | github.com/nodejs/node git https://github.com/nodejs/node.git |
| octolytics-dimension-user_id | 9950313 |
| octolytics-dimension-user_login | nodejs |
| octolytics-dimension-repository_id | 27193779 |
| octolytics-dimension-repository_nwo | nodejs/node |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 27193779 |
| octolytics-dimension-repository_network_root_nwo | nodejs/node |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 98b41fa4b5635ceb45a4c54320fced73817ff290 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
| react-app-name | issues |
Links:
Viewport: width=device-width