Welcome! Log In Create A New Profile

Advanced

[njs] Fixed Array.prototype.slice() for UTF8-invalid byte strings.

Dmitry Volyntsev
May 17, 2019 10:54AM
details: https://hg.nginx.org/njs/rev/9af8e1b5f3c1
branches:
changeset: 968:9af8e1b5f3c1
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Fri May 17 17:52:30 2019 +0300
description:
Fixed Array.prototype.slice() for UTF8-invalid byte strings.

This closes #160 issue on Github.

diffstat:

njs/njs_array.c | 31 ++++++++++++++++++-------------
njs/test/njs_unit_test.c | 3 +++
2 files changed, 21 insertions(+), 13 deletions(-)

diffs (66 lines):

diff -r 58de3054b28a -r 9af8e1b5f3c1 njs/njs_array.c
--- a/njs/njs_array.c Tue May 14 13:00:44 2019 +0300
+++ b/njs/njs_array.c Fri May 17 17:52:30 2019 +0300
@@ -577,7 +577,7 @@ njs_array_prototype_slice_copy(njs_vm_t
{
size_t size;
u_char *dst;
- uint32_t n, len;
+ uint32_t n;
njs_ret_t ret;
njs_array_t *array;
njs_value_t *value, name;
@@ -623,23 +623,28 @@ njs_array_prototype_slice_copy(njs_vm_t

if (string.length == 0) {
/* Byte string. */
- len = 0;
+ do {
+ value = &array->start[n++];
+ dst = njs_string_short_start(value);
+ *dst = *src++;
+ njs_string_short_set(value, 1, 0);
+
+ length--;
+ } while (length != 0);

} else {
/* UTF-8 or ASCII string. */
- len = 1;
+ do {
+ value = &array->start[n++];
+ dst = njs_string_short_start(value);
+ dst = nxt_utf8_copy(dst, &src, end);
+ size = dst - njs_string_short_start(value);
+ njs_string_short_set(value, size, 1);
+
+ length--;
+ } while (length != 0);
}

- do {
- value = &array->start[n++];
- dst = njs_string_short_start(value);
- dst = nxt_utf8_copy(dst, &src, end);
- size = dst - njs_string_short_start(value);
- njs_string_short_set(value, size, len);
-
- length--;
- } while (length != 0);
-
} else if (njs_is_object(this)) {

do {
diff -r 58de3054b28a -r 9af8e1b5f3c1 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Tue May 14 13:00:44 2019 +0300
+++ b/njs/test/njs_unit_test.c Fri May 17 17:52:30 2019 +0300
@@ -3657,6 +3657,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Array.prototype.slice.call('αβZγ')"),
nxt_string("α,β,Z,γ") },

+ { nxt_string("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
+ nxt_string("157") },
+
{ nxt_string("Array.prototype.slice.call('αβZγ', 1)"),
nxt_string("β,Z,γ") },

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Fixed Array.prototype.slice() for UTF8-invalid byte strings.

Dmitry Volyntsev 419 May 17, 2019 10:54AM



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

Online Users

Guests: 289
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready