]> git.kaiwu.me - njs.git/commitdiff
Fixed String.prototype.replace() with byte strings.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 4 Jun 2022 06:24:12 +0000 (23:24 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 4 Jun 2022 06:24:12 +0000 (23:24 -0700)
This closes #522 issue on Github.

src/njs_string.c
src/test/njs_unit_test.c

index c061fa99ffc7089ea32fb93d42e264357547d209..3cee90ab8b48b1ba60ca2a6d6c9c3c21b479fad3 100644 (file)
@@ -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)) {
index 958b0049fb8928d09a550a25ac71dc7a054117b1..e700676158abfe575be4690ee0436eadad5a65f0 100644 (file)
@@ -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") },