Welcome! Log In Create A New Profile

Advanced

[njs] Fixed RegExp() constructor with empty pattern and non-empty flags.

Dmitry Volyntsev
April 14, 2020 08:50AM
details: https://hg.nginx.org/njs/rev/c6f1ae6d8fac
branches:
changeset: 1372:c6f1ae6d8fac
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Tue Apr 14 12:42:05 2020 +0000
description:
Fixed RegExp() constructor with empty pattern and non-empty flags.

diffstat:

src/njs_regexp.c | 54 +++++++++++++++++++----------------------------
src/test/njs_unit_test.c | 9 ++++++++
2 files changed, 31 insertions(+), 32 deletions(-)

diffs (108 lines):

diff -r 777ed1eb1918 -r c6f1ae6d8fac src/njs_regexp.c
--- a/src/njs_regexp.c Tue Apr 14 12:18:25 2020 +0000
+++ b/src/njs_regexp.c Tue Apr 14 12:42:05 2020 +0000
@@ -104,29 +104,11 @@ njs_regexp_constructor(njs_vm_t *vm, njs
u_char *start;
njs_int_t ret;
njs_str_t string;
- njs_value_t source, flags_string, *pattern, *flags;
+ njs_value_t source, *pattern, *flags;
njs_regexp_flags_t re_flags;

pattern = njs_arg(args, nargs, 1);

- if (!njs_is_regexp(pattern) && !njs_is_primitive(pattern)) {
- ret = njs_value_to_string(vm, &args[1], &args[1]);
- if (ret != NJS_OK) {
- return ret;
- }
- }
-
- flags = njs_arg(args, nargs, 2);
-
- if (!njs_is_primitive(flags)) {
- ret = njs_value_to_string(vm, &args[2], &args[2]);
- if (ret != NJS_OK) {
- return ret;
- }
- }
-
- re_flags = 0;
-
if (njs_is_regexp(pattern)) {
ret = njs_regexp_prototype_source(vm, NULL, pattern, NULL, &source);
if (njs_slow_path(ret != NJS_OK)) {
@@ -138,25 +120,28 @@ njs_regexp_constructor(njs_vm_t *vm, njs
pattern = &source;

} else {
- if (njs_is_undefined(pattern)) {
+ if (njs_is_defined(pattern)) {
+ ret = njs_value_to_string(vm, pattern, pattern);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+
+ } else {
pattern = njs_value_arg(&njs_string_empty);
}

- ret = njs_primitive_value_to_string(vm, &source, pattern);
+ re_flags = 0;
+ }
+
+ flags = njs_arg(args, nargs, 2);
+
+ if (njs_is_defined(flags)) {
+ ret = njs_value_to_string(vm, flags, flags);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}

- pattern = &source;
- }
-
- if (njs_is_defined(flags)) {
- ret = njs_primitive_value_to_string(vm, &flags_string, flags);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- njs_string_get(&flags_string, &string);
+ njs_string_get(flags, &string);

start = string.start;

@@ -181,7 +166,12 @@ njs_regexp_create(njs_vm_t *vm, njs_valu
njs_regexp_t *regexp;
njs_regexp_pattern_t *pattern;

- if (length != 0) {
+ if (length != 0 || flags != 0) {
+ if (length == 0) {
+ start = (u_char *) "(?:)";
+ length = njs_length("(?:)");
+ }
+
pattern = njs_regexp_pattern_create(vm, start, length, flags);
if (njs_slow_path(pattern == NULL)) {
return NJS_ERROR;
diff -r 777ed1eb1918 -r c6f1ae6d8fac src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Tue Apr 14 12:18:25 2020 +0000
+++ b/src/test/njs_unit_test.c Tue Apr 14 12:42:05 2020 +0000
@@ -7391,6 +7391,15 @@ static njs_unit_test_t njs_test[] =
{ njs_str("RegExp('\\\\0').source[1]"),
njs_str("0") },

+ { njs_str("RegExp(undefined, 'g').global"),
+ njs_str("true") },
+
+ { njs_str("RegExp('', 'g').global"),
+ njs_str("true") },
+
+ { njs_str("var x; RegExp(x, 'g')"),
+ njs_str("/(?:)/g") },
+
{ njs_str("']'.match(/]/)"),
njs_str("]") },

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Fixed RegExp() constructor with empty pattern and non-empty flags.

Dmitry Volyntsev 325 April 14, 2020 08:50AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 150
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready