]> git.kaiwu.me - njs.git/commitdiff
Fixed RegExp literal parsing.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 5 Mar 2019 16:54:23 +0000 (19:54 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 5 Mar 2019 16:54:23 +0000 (19:54 +0300)
njs/njs_regexp.c
njs/test/njs_unit_test.c

index 457836b4a1328226a2a62d4b32bdefd70f04ee97..8bc31d3b42dedb5e0e9835039bc5f3bb0b49f0d7 100644 (file)
@@ -138,7 +138,7 @@ njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
 njs_token_t
 njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser, njs_value_t *value)
 {
-    u_char                *p;
+    u_char                *p, c;
     njs_lexer_t           *lexer;
     njs_regexp_flags_t    flags;
     njs_regexp_pattern_t  *pattern;
@@ -147,12 +147,13 @@ njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser, njs_value_t *value)
 
     for (p = lexer->start; p < lexer->end; p++) {
 
-        if (*p == '\\') {
-            p++;
-            continue;
+        c = *p;
+
+        if (c == '\n' || c == '\r') {
+            break;
         }
 
-        if (*p == '/') {
+        if (c == '/' && !(p > lexer->start && p[-1] == '\\')) {
             lexer->text.start = lexer->start;
             lexer->text.length = p - lexer->text.start;
             p++;
index 2954a9a2fa7bd30a7d0ca1a25bbf784b4e72559b..35e874cac54360c9f05b29cfcc884999ccead8b0 100644 (file)
@@ -6526,6 +6526,21 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("/"),
       nxt_string("SyntaxError: Unterminated RegExp \"/\" in 1") },
 
+    { nxt_string("/a\n/"),
+      nxt_string("SyntaxError: Unterminated RegExp \"/a\" in 1") },
+
+    { nxt_string("/a\r/"),
+      nxt_string("SyntaxError: Unterminated RegExp \"/a\" in 1") },
+
+    { nxt_string("/a\\q/"),
+      nxt_string("/a\\q/") },
+
+    { nxt_string("/a\\q/.test('a\\q')"),
+      nxt_string("true") },
+
+    { nxt_string("/(\\.(?!com|org)|\\/)/.test('ah.info')"),
+      nxt_string("true") },
+
     { nxt_string("/(/.test('')"),
       nxt_string("SyntaxError: pcre_compile(\"(\") failed: missing ) in 1") },