]> git.kaiwu.me - njs.git/commitdiff
Fixed String.prototype.replaceAll() with zero length argument.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 23 May 2024 00:26:08 +0000 (17:26 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 23 May 2024 00:26:08 +0000 (17:26 -0700)
This fixes #712 issue on Github.

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

index 9551427429e5adfab0ef6b1b04be759e02e18859..54a6ae5a28d5248e6913278290c19d99e1940fc8 100644 (file)
@@ -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);
index ef746ae529e8d2de01ea60b35115dc280eb28252..a83c406a152769822295f492d394b6382990b16a 100644 (file)
@@ -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);
 }
index d8b4dac68767fd05784be4905ef35829fec2d25c..981404ee03d2939c1a3bd6a742494f18642045af 100644 (file)
@@ -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") },