Welcome! Log In Create A New Profile

Advanced

[njs] Fixed Buffer.prototype.indexOf() and friends.

Anonymous User
October 10, 2024 12:46PM
details: https://github.com/nginx/njs/commit/5a8bb2d172ad080efc0d719e7df609ac5355992e
branches: master
commit: 5a8bb2d172ad080efc0d719e7df609ac5355992e
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Wed, 9 Oct 2024 18:25:52 -0700
description:
Fixed Buffer.prototype.indexOf() and friends.

With empty buffers in both the self and search cases.

---
src/njs_buffer.c | 39 ++++++++-------------------------------
src/qjs_buffer.c | 39 ++++++++-------------------------------
test/buffer.t.js | 26 ++++++++++++++++++++++++++
3 files changed, 42 insertions(+), 62 deletions(-)

diff --git a/src/njs_buffer.c b/src/njs_buffer.c
index 20618d24..2f0fc620 100644
--- a/src/njs_buffer.c
+++ b/src/njs_buffer.c
@@ -2117,10 +2117,6 @@ njs_buffer_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,

index = -1;

- if (njs_slow_path(array->byte_length == 0)) {
- goto done;
- }
-
length = array->byte_length;

if (last) {
@@ -2145,30 +2141,11 @@ njs_buffer_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
return ret;
}

- if (last) {
- if (from >= 0) {
- from = njs_min(from, length - 1);
-
- } else if (from < 0) {
- from += length;
- }
-
- if (from <= to) {
- goto done;
- }
+ if (from >= 0) {
+ from = njs_min(from, length);

} else {
- if (from < 0) {
- from += length;
-
- if (from < 0) {
- from = 0;
- }
- }
-
- if (from >= to) {
- goto done;
- }
+ from = njs_max(0, length + from);
}
}

@@ -2213,11 +2190,6 @@ encoding:
str.length = src->byte_length;
}

- if (njs_slow_path(str.length == 0)) {
- index = (last) ? length : 0;
- goto done;
- }
-
if (last) {
from = njs_min(from, length - (int64_t) str.length);

@@ -2233,6 +2205,11 @@ encoding:
}
}

+ if (from == to && str.length == 0) {
+ index = 0;
+ goto done;
+ }
+
for (i = from; i != to; i += increment) {
if (memcmp(&u8[i], str.start, str.length) == 0) {
index = i;
diff --git a/src/qjs_buffer.c b/src/qjs_buffer.c
index 8a7b10ff..02618387 100644
--- a/src/qjs_buffer.c
+++ b/src/qjs_buffer.c
@@ -988,10 +988,6 @@ qjs_buffer_prototype_index_of(JSContext *ctx, JSValueConst this_val, int argc,

length = self.length;

- if (length == 0) {
- return JS_NewInt32(ctx, -1);
- }
-
if (last) {
from = length - 1;
to = -1;
@@ -1015,30 +1011,11 @@ qjs_buffer_prototype_index_of(JSContext *ctx, JSValueConst this_val, int argc,
return JS_EXCEPTION;
}

- if (last) {
- if (from >= 0) {
- from = njs_min(from, length - 1);
-
- } else if (from < 0) {
- from += length;
- }
-
- if (from <= to) {
- return JS_NewInt32(ctx, -1);
- }
+ if (from >= 0) {
+ from = njs_min(from, length);

} else {
- if (from < 0) {
- from += length;
-
- if (from < 0) {
- from = 0;
- }
- }
-
- if (from >= to) {
- return JS_NewInt32(ctx, -1);
- }
+ from = njs_max(0, length + from);
}
}

@@ -1086,11 +1063,6 @@ encoding:
"or Buffer-like object");
}

- if (str.length == 0) {
- JS_FreeValue(ctx, buffer);
- return JS_NewInt32(ctx, (last) ? length : 0);
- }
-
if (last) {
from = njs_min(from, length - (int64_t) str.length);

@@ -1106,6 +1078,11 @@ encoding:
}
}

+ if (from == to && str.length == 0) {
+ JS_FreeValue(ctx, buffer);
+ return JS_NewInt32(ctx, 0);
+ }
+
for (i = from; i != to; i += increment) {
if (memcmp(&self.start[i], str.start, str.length) == 0) {
JS_FreeValue(ctx, buffer);
diff --git a/test/buffer.t.js b/test/buffer.t.js
index 0b8db0d3..9becf487 100644
--- a/test/buffer.t.js
+++ b/test/buffer.t.js
@@ -474,6 +474,19 @@ let indexOf_tsuite = {
{ buf: Buffer.from('abcdef'), value: 'def', offset: 1, expected: 3 },
{ buf: Buffer.from('abcdef'), value: 'def', offset: -3, expected: 3 },
{ buf: Buffer.from('abcdef'), value: 'efgh', offset: 4, expected: -1 },
+ { buf: Buffer.from(''), value: '', expected: 0 },
+ { buf: Buffer.from(''), value: '', offset: -1, expected: 0 },
+ { buf: Buffer.from(''), value: '', offset: 0, expected: 0 },
+ { buf: Buffer.from(''), value: '', offset: 1, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: -4, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: -3, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: -2, expected: 1 },
+ { buf: Buffer.from('abc'), value: '', offset: -1, expected: 2 },
+ { buf: Buffer.from('abc'), value: '', offset: 0, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: 1, expected: 1 },
+ { buf: Buffer.from('abc'), value: '', offset: 2, expected: 2 },
+ { buf: Buffer.from('abc'), value: '', offset: 3, expected: 3 },
+ { buf: Buffer.from('abc'), value: '', offset: 4, expected: 3 },
{ buf: Buffer.from('abcdef'), value: '626364', encoding: 'hex', expected: 1 },
{ buf: Buffer.from('abcdef'), value: '626364', encoding: 'utf-128',
exception: 'TypeError: "utf-128" encoding is not supported' },
@@ -584,6 +597,19 @@ let lastIndexOf_tsuite = {
{ buf: Buffer.from('abcdef'), value: 'abc', offset: 1, expected: 0 },
{ buf: Buffer.from('abcdef'), value: 'def', offset: 1, expected: -1 },
{ buf: Buffer.from('xxxABCx'), value: 'ABC', offset: 3, expected: 3 },
+ { buf: Buffer.from(''), value: '', expected: 0 },
+ { buf: Buffer.from(''), value: '', offset: -1, expected: 0 },
+ { buf: Buffer.from(''), value: '', offset: 0, expected: 0 },
+ { buf: Buffer.from(''), value: '', offset: 1, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: -4, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: -3, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: -2, expected: 1 },
+ { buf: Buffer.from('abc'), value: '', offset: -1, expected: 2 },
+ { buf: Buffer.from('abc'), value: '', offset: 0, expected: 0 },
+ { buf: Buffer.from('abc'), value: '', offset: 1, expected: 1 },
+ { buf: Buffer.from('abc'), value: '', offset: 2, expected: 2 },
+ { buf: Buffer.from('abc'), value: '', offset: 3, expected: 3 },
+ { buf: Buffer.from('abc'), value: '', offset: 4, expected: 3 },
{ buf: Buffer.from(Buffer.alloc(7).fill('Zabcdef').buffer, 1), value: 'abcdef', expected: 0 },
{ buf: Buffer.from(Buffer.alloc(7).fill('Zabcdef').buffer, 1), value: 'abcdefg', expected: -1 },
{ buf: Buffer.from('abcdef'), value: '626364', encoding: 'hex', expected: 1 },
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Fixed Buffer.prototype.indexOf() and friends.

Anonymous User 187 October 10, 2024 12:46PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 174
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready