From 3a5042f66aeae484aead80b0e172827fbccc3be1 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Wed, 22 May 2024 17:26:08 -0700 Subject: [PATCH] Fixed String.prototype.replaceAll() with zero length argument. This fixes #712 issue on Github. --- src/njs_string.c | 15 ++++----------- src/njs_string.h | 4 ++++ src/test/njs_unit_test.c | 6 ++++++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/njs_string.c b/src/njs_string.c index 95514274..54a6ae5a 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -1736,7 +1736,9 @@ njs_string_index_of(njs_string_prop_t *string, njs_string_prop_t *search, } else { /* UTF-8 string. */ - p = njs_string_utf8_offset(string->start, end, index); + p = (index < string->length) + ? njs_string_utf8_offset(string->start, end, index) + : end; end -= search->size - 1; while (p < end) { @@ -3231,7 +3233,6 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_int_t ret; njs_str_t str; njs_chb_t chain; - njs_bool_t is_ascii_string; njs_value_t *this, *search, *replace; njs_value_t search_lvalue, replace_lvalue, replacer, value, arguments[3]; @@ -3378,7 +3379,6 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, p_start = string.start; increment = s.length != 0 ? s.length : 1; - is_ascii_string = njs_is_ascii_string(&string); do { if (func_replace == NULL) { @@ -3405,14 +3405,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } - if (is_ascii_string) { - p = string.start + pos; - - } else { - p = njs_string_utf8_offset(string.start, string.start + string.size, - pos); - } - + p = njs_string_offset(&string, pos); (void) njs_string_prop(&ret_string, &value); njs_chb_append(&chain, p_start, p - p_start); diff --git a/src/njs_string.h b/src/njs_string.h index ef746ae5..a83c406a 100644 --- a/src/njs_string.h +++ b/src/njs_string.h @@ -245,6 +245,10 @@ njs_string_offset(njs_string_prop_t *string, int64_t index) /* UTF-8 string. */ + if (index == (int64_t) string->length) { + return string->start + string->size; + } + return njs_string_utf8_offset(string->start, string->start + string->size, index); } diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index d8b4dac6..981404ee 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -8888,6 +8888,12 @@ static njs_unit_test_t njs_test[] = { njs_str("var r = 'αβγ'.replaceAll('', 'X'); [r, r.length]"), njs_str("XαXβXγX,7") }, + { njs_str("var r = ''.replaceAll('', 'z'); [r, r.length]"), + njs_str("z,1") }, + + { njs_str("var r = 'α'.padStart(32).replaceAll('', 'z'); [r, r.length]"), + njs_str("z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z zαz,65") }, + { njs_str("'abc'.replace('b', (m, o, s) => `|${s}|${o}|${m}|`)"), njs_str("a|abc|1|b|c") }, -- 2.47.3