Commit e6d47201e15 for nodejs
commit e6d47201e15fba0537ebf9f91840f7cabbb868e3
Author: Hilary Asogwa <76795262+Dansatch@users.noreply.github.com>
Date: Mon Sep 28 18:58:14 2026 +0100
buffer: fix negative index for large buffers
Fix incorrect negative index results for large buffers.
Add tests for number, Buffer and string searches beyond 2 GiB.
Fixes: https://github.com/nodejs/node/issues/66294
Signed-off-by: dansatch <dansatch98@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/66325
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index 7ade56fd892..67ba73dd488 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -1157,8 +1157,8 @@ void IndexOfString(const FunctionCallbackInfo<Value>& args) {
is_forward);
}
- args.GetReturnValue().Set(result >= search_end ? -1
- : static_cast<int>(result));
+ args.GetReturnValue().Set(
+ result >= search_end ? -1 : static_cast<int64_t>(result));
}
void IndexOfBuffer(const FunctionCallbackInfo<Value>& args) {
@@ -1245,11 +1245,11 @@ void IndexOfBuffer(const FunctionCallbackInfo<Value>& args) {
is_forward);
}
- args.GetReturnValue().Set(result >= search_end ? -1
- : static_cast<int>(result));
+ args.GetReturnValue().Set(
+ result >= search_end ? -1 : static_cast<int64_t>(result));
}
-int32_t IndexOfNumberImpl(Local<Value> buffer_obj,
+int64_t IndexOfNumberImpl(Local<Value> buffer_obj,
const uint32_t needle,
const int64_t offset_i64,
const int64_t end_i64,
@@ -1276,7 +1276,7 @@ int32_t IndexOfNumberImpl(Local<Value> buffer_obj,
ptr = nbytes::stringsearch::MemrchrFill(buffer_data, needle, backward_end);
}
const uint8_t* ptr_uint8 = static_cast<const uint8_t*>(ptr);
- return ptr != nullptr ? static_cast<int32_t>(ptr_uint8 - buffer_data) : -1;
+ return ptr != nullptr ? static_cast<int64_t>(ptr_uint8 - buffer_data) : -1;
}
void SlowIndexOfNumber(const FunctionCallbackInfo<Value>& args) {
@@ -1297,7 +1297,7 @@ void SlowIndexOfNumber(const FunctionCallbackInfo<Value>& args) {
IndexOfNumberImpl(buffer_obj, needle, offset_i64, end_i64, is_forward));
}
-int32_t FastIndexOfNumber(Local<Value>,
+int64_t FastIndexOfNumber(Local<Value>,
Local<Value> buffer_obj,
uint32_t needle,
int64_t offset_i64,
diff --git a/test/pummel/test-buffer-indexof-large.js b/test/pummel/test-buffer-indexof-large.js
new file mode 100644
index 00000000000..0f099970541
--- /dev/null
+++ b/test/pummel/test-buffer-indexof-large.js
@@ -0,0 +1,27 @@
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+
+common.skipIf32Bits();
+
+const match = 2 ** 31 + 100;
+let buffer;
+try {
+ buffer = Buffer.allocUnsafe(match + 1);
+} catch (error) {
+ if (error.code === 'ERR_MEMORY_ALLOCATION_FAILED' ||
+ /Array buffer allocation failed/.test(error.message)) {
+ common.skip('insufficient space for Buffer.allocUnsafe');
+ }
+ throw error;
+}
+
+buffer[match] = 0x0a;
+
+assert.strictEqual(buffer.indexOf(0x0a, -1), match);
+assert.strictEqual(buffer.indexOf(Buffer.from([0x0a]), -1), match);
+assert.strictEqual(buffer.indexOf('\n', -1), match);
+assert.strictEqual(buffer.lastIndexOf(0x0a, -1), match);
+assert.strictEqual(buffer.lastIndexOf(Buffer.from([0x0a]), -1), match);
+assert.strictEqual(buffer.lastIndexOf('\n', -1), match);