From 1762c93ec8b5aaa968a07d74471caf574f9ae9ae Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 5 Mar 2019 19:54:23 +0300 Subject: [PATCH] Fixed RegExp literal parsing. --- njs/njs_regexp.c | 11 ++++++----- njs/test/njs_unit_test.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/njs/njs_regexp.c b/njs/njs_regexp.c index 457836b4..8bc31d3b 100644 --- a/njs/njs_regexp.c +++ b/njs/njs_regexp.c @@ -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++; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 2954a9a2..35e874ca 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") }, -- 2.47.3