summaryrefslogtreecommitdiff
path: root/src/node_file.cc
diff options
context:
space:
mode:
authorZach Bjornson <zbbjornson@gmail.com>2019-03-18 11:27:13 -0700
committerRich Trott <rtrott@gmail.com>2019-08-16 22:09:27 -0700
commit0bbda5e5aede9b264a3c6188529c9dbed1ec9719 (patch)
treed5b87a4fe8a7e9e12f91fc71f983c5d0a661c33d /src/node_file.cc
parent91a4cb71753b7c7012022e3e67c7a1f16f3b5e80 (diff)
downloadandroid-node-v8-0bbda5e5aede9b264a3c6188529c9dbed1ec9719.tar.gz
android-node-v8-0bbda5e5aede9b264a3c6188529c9dbed1ec9719.tar.bz2
android-node-v8-0bbda5e5aede9b264a3c6188529c9dbed1ec9719.zip
fs: allow int64 offset in fs.read/readSync/fd.read
Since v10.10.0, 'buf' can be any DataView, meaning the largest byteLength can be Float64Array.BYTES_PER_ELEMENT * kMaxLength = 17,179,869,176. 'offset' can now be up to 2**53 - 1. This makes it possible to tile reads into a large buffer. Breaking: now throws if read offset is not a safe int, is null or is undefined. Fixes https://github.com/nodejs/node/issues/26563 PR-URL: https://github.com/nodejs/node/pull/26572 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src/node_file.cc')
-rw-r--r--src/node_file.cc12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/node_file.cc b/src/node_file.cc
index 138848c49d..5bd0237e7b 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -1851,7 +1851,7 @@ static void WriteString(const FunctionCallbackInfo<Value>& args) {
*
* 0 fd int32. file descriptor
* 1 buffer instance of Buffer
- * 2 offset int32. offset to start reading into inside buffer
+ * 2 offset int64. offset to start reading into inside buffer
* 3 length int32. length to read
* 4 position int64. file position - -1 for current position
*/
@@ -1869,15 +1869,17 @@ static void Read(const FunctionCallbackInfo<Value>& args) {
char* buffer_data = Buffer::Data(buffer_obj);
size_t buffer_length = Buffer::Length(buffer_obj);
- CHECK(args[2]->IsInt32());
- const size_t off = static_cast<size_t>(args[2].As<Int32>()->Value());
- CHECK_LT(off, buffer_length);
+ CHECK(IsSafeJsInt(args[2]));
+ const int64_t off_64 = args[2].As<Integer>()->Value();
+ CHECK_GE(off_64, 0);
+ CHECK_LT(static_cast<uint64_t>(off_64), buffer_length);
+ const size_t off = static_cast<size_t>(off_64);
CHECK(args[3]->IsInt32());
const size_t len = static_cast<size_t>(args[3].As<Int32>()->Value());
CHECK(Buffer::IsWithinBounds(off, len, buffer_length));
- CHECK(args[4]->IsNumber());
+ CHECK(IsSafeJsInt(args[4]));
const int64_t pos = args[4].As<Integer>()->Value();
char* buf = buffer_data + off;