From 36f04a3178fcb6da8513cc3dbf35215c2a581b3f Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Fri, 3 Jun 2022 23:24:12 -0700 Subject: [PATCH] Fixed String.prototype.replace() with byte strings. This closes #522 issue on Github. --- src/njs_string.c | 21 ++++++++++++++------- src/test/njs_unit_test.c | 5 +++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/njs_string.c b/src/njs_string.c index c061fa99..3cee90ab 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -3663,7 +3663,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { u_char *r; - size_t length, search_length, ret_length, size; + size_t length, size; int64_t pos; njs_int_t ret; njs_value_t *this, *search, *replace; @@ -3722,8 +3722,8 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } - length = njs_string_prop(&string, this); - search_length = njs_string_prop(&s, search); + (void) njs_string_prop(&string, this); + (void) njs_string_prop(&s, search); pos = njs_string_index_of(&string, &s, 0); if (pos < 0) { @@ -3757,7 +3757,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } - if (length == string.size) { + if (njs_is_byte_or_ascii_string(&string)) { p = string.start + pos; } else { @@ -3765,10 +3765,17 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, p = njs_string_offset(string.start, string.start + string.size, pos); } - ret_length = njs_string_prop(&ret_string, &retval); + (void) njs_string_prop(&ret_string, &retval); + + size = string.size + ret_string.size - s.size; + length = string.length + ret_string.length - s.length; - size = string.size + ret_string.size - s.size; - length += ret_length - search_length; + if (njs_is_byte_string(&string) + || njs_is_byte_string(&s) + || njs_is_byte_string(&ret_string)) + { + length = 0; + } r = njs_string_alloc(vm, &vm->retval, size, length); if (njs_slow_path(r == NULL)) { diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 958b0049..e7006761 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -8438,6 +8438,11 @@ static njs_unit_test_t njs_test[] = { njs_str("var r = 'αβγ'.replace('', 'X'); [r, r.length]"), njs_str("Xαβγ,4") }, + { njs_str("var s = 'αz'.toUTF8();" + "var r = s.replace('z', 'β');" + "r.length"), + njs_str("4") }, + { njs_str("'abc'.replace('b', (m, o, s) => `|${s}|${o}|${m}|`)"), njs_str("a|abc|1|b|c") }, -- 2.47.3