From: Dmitry Volyntsev Date: Sat, 4 Jun 2022 06:24:12 +0000 (-0700) Subject: Fixed String.prototype.replace() with byte strings. X-Git-Tag: 0.7.5~15 X-Git-Url: http://www.kaiwu.me/postgresql/commit/static/gitweb.js?a=commitdiff_plain;h=36f04a3178fcb6da8513cc3dbf35215c2a581b3f;p=njs.git Fixed String.prototype.replace() with byte strings. This closes #522 issue on Github. --- 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") },