Skip to content

Commit ce4fbf0

Browse files
Dansatchaduh95
authored andcommitted
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: #66294 Signed-off-by: dansatch <dansatch98@gmail.com> PR-URL: #66325 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Filip Skokan <panva.ip@gmail.com>
1 parent ae4a16a commit ce4fbf0

2 files changed

Lines changed: 34 additions & 7 deletions

File tree

‎src/node_buffer.cc‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,8 +1157,8 @@ void IndexOfString(const FunctionCallbackInfo<Value>& args) {
11571157
is_forward);
11581158
}
11591159

1160-
args.GetReturnValue().Set(result >= search_end ? -1
1161-
: static_cast<int>(result));
1160+
args.GetReturnValue().Set(
1161+
result >= search_end ? -1 : static_cast<int64_t>(result));
11621162
}
11631163

11641164
void IndexOfBuffer(const FunctionCallbackInfo<Value>& args) {
@@ -1245,11 +1245,11 @@ void IndexOfBuffer(const FunctionCallbackInfo<Value>& args) {
12451245
is_forward);
12461246
}
12471247

1248-
args.GetReturnValue().Set(result >= search_end ? -1
1249-
: static_cast<int>(result));
1248+
args.GetReturnValue().Set(
1249+
result >= search_end ? -1 : static_cast<int64_t>(result));
12501250
}
12511251

1252-
int32_t IndexOfNumberImpl(Local<Value> buffer_obj,
1252+
int64_t IndexOfNumberImpl(Local<Value> buffer_obj,
12531253
const uint32_t needle,
12541254
const int64_t offset_i64,
12551255
const int64_t end_i64,
@@ -1276,7 +1276,7 @@ int32_t IndexOfNumberImpl(Local<Value> buffer_obj,
12761276
ptr = nbytes::stringsearch::MemrchrFill(buffer_data, needle, backward_end);
12771277
}
12781278
const uint8_t* ptr_uint8 = static_cast<const uint8_t*>(ptr);
1279-
return ptr != nullptr ? static_cast<int32_t>(ptr_uint8 - buffer_data) : -1;
1279+
return ptr != nullptr ? static_cast<int64_t>(ptr_uint8 - buffer_data) : -1;
12801280
}
12811281

12821282
void SlowIndexOfNumber(const FunctionCallbackInfo<Value>& args) {
@@ -1297,7 +1297,7 @@ void SlowIndexOfNumber(const FunctionCallbackInfo<Value>& args) {
12971297
IndexOfNumberImpl(buffer_obj, needle, offset_i64, end_i64, is_forward));
12981298
}
12991299

1300-
int32_t FastIndexOfNumber(Local<Value>,
1300+
int64_t FastIndexOfNumber(Local<Value>,
13011301
Local<Value> buffer_obj,
13021302
uint32_t needle,
13031303
int64_t offset_i64,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
6+
common.skipIf32Bits();
7+
8+
const match = 2 ** 31 + 100;
9+
let buffer;
10+
try {
11+
buffer = Buffer.allocUnsafe(match + 1);
12+
} catch (error) {
13+
if (error.code === 'ERR_MEMORY_ALLOCATION_FAILED' ||
14+
/Array buffer allocation failed/.test(error.message)) {
15+
common.skip('insufficient space for Buffer.allocUnsafe');
16+
}
17+
throw error;
18+
}
19+
20+
buffer[match] = 0x0a;
21+
22+
assert.strictEqual(buffer.indexOf(0x0a, -1), match);
23+
assert.strictEqual(buffer.indexOf(Buffer.from([0x0a]), -1), match);
24+
assert.strictEqual(buffer.indexOf('\n', -1), match);
25+
assert.strictEqual(buffer.lastIndexOf(0x0a, -1), match);
26+
assert.strictEqual(buffer.lastIndexOf(Buffer.from([0x0a]), -1), match);
27+
assert.strictEqual(buffer.lastIndexOf('\n', -1), match);

0 commit comments

Comments
 (0)