Skip to content

Commit

Permalink
Fixed String.prototype.replaceAll() with zero length argument.
Browse files Browse the repository at this point in the history
This fixes #712 issue on Github.
  • Loading branch information
xeioex committed May 23, 2024
1 parent 4bb4c5e commit 3a5042f
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 11 deletions.
15 changes: 4 additions & 11 deletions src/njs_string.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/njs_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
6 changes: 6 additions & 0 deletions src/test/njs_unit_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -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") },

Expand Down

0 comments on commit 3a5042f

Please sign in to comment.