mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Fix invalid control escapes during RegExp parsing.
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai.u-szeged@partner.samsung.com
This commit is contained in:
parent
c4b1f02947
commit
d2ac7c320d
@ -265,7 +265,7 @@ re_count_num_of_groups (re_parser_ctx_t *parser_ctx_p) /**< RegExp parser contex
|
||||
}
|
||||
case LIT_CHAR_RIGHT_SQUARE:
|
||||
{
|
||||
if (!char_class_in)
|
||||
if (char_class_in)
|
||||
{
|
||||
char_class_in--;
|
||||
}
|
||||
@ -378,18 +378,22 @@ re_parse_char_class (re_parser_ctx_t *parser_ctx_p, /**< number of classes */
|
||||
}
|
||||
else if (ch == LIT_CHAR_LOWERCASE_C)
|
||||
{
|
||||
if (lit_utf8_iterator_is_eos (iter_p))
|
||||
if (!lit_utf8_iterator_is_eos (iter_p))
|
||||
{
|
||||
return ecma_raise_syntax_error ("invalid character class, end of string after '\\c'");
|
||||
}
|
||||
ch = lit_utf8_iterator_peek_next (iter_p);
|
||||
|
||||
ch = lit_utf8_iterator_read_next (iter_p);
|
||||
|
||||
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
|
||||
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END))
|
||||
{
|
||||
/* See ECMA-262 v5, 15.10.2.10 (Point 3) */
|
||||
ch = (ch % 32);
|
||||
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
|
||||
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END)
|
||||
|| (ch >= LIT_CHAR_0 && ch <= LIT_CHAR_9))
|
||||
{
|
||||
/* See ECMA-262 v5, 15.10.2.10 (Point 3) */
|
||||
ch = (ch % 32);
|
||||
lit_utf8_iterator_incr (iter_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
ch = LIT_CHAR_LOWERCASE_C;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (ch == LIT_CHAR_LOWERCASE_X)
|
||||
@ -627,19 +631,26 @@ re_parse_next_token (re_parser_ctx_t *parser_ctx_p, /**< RegExp parser context *
|
||||
}
|
||||
else if (ch == LIT_CHAR_LOWERCASE_C)
|
||||
{
|
||||
if (lit_utf8_iterator_is_eos (iter_p))
|
||||
if (!lit_utf8_iterator_is_eos (iter_p))
|
||||
{
|
||||
out_token_p->value = ch;
|
||||
break;
|
||||
ch = lit_utf8_iterator_peek_next (iter_p);
|
||||
|
||||
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
|
||||
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END))
|
||||
{
|
||||
out_token_p->value = (ch % 32);
|
||||
lit_utf8_iterator_incr (iter_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
out_token_p->value = LIT_CHAR_BACKSLASH;
|
||||
lit_utf8_iterator_decr (iter_p);
|
||||
}
|
||||
}
|
||||
|
||||
ch = lit_utf8_iterator_peek_next (iter_p);
|
||||
|
||||
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
|
||||
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END))
|
||||
else
|
||||
{
|
||||
out_token_p->value = (ch % 32);
|
||||
lit_utf8_iterator_advance (iter_p, 1);
|
||||
out_token_p->value = LIT_CHAR_BACKSLASH;
|
||||
lit_utf8_iterator_decr (iter_p);
|
||||
}
|
||||
}
|
||||
else if (ch == LIT_CHAR_LOWERCASE_X
|
||||
|
||||
@ -74,3 +74,18 @@ assert (/([abc]+)\40([d-f]+)\12\1/.exec("abc def\nabc") == "abc def\nabc,abc,def
|
||||
|
||||
var expected = "8765432911,8,7,6,5,4,3,2,9,1";
|
||||
assert (/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)\9(\d)\9/.exec("8765432911") == expected);
|
||||
|
||||
r = /\c/;
|
||||
assert (r.exec ("\\c") == "\\c");
|
||||
|
||||
r = /[\c]/;
|
||||
assert (r.exec ("c") == "c");
|
||||
|
||||
r = /[\c1]/;
|
||||
assert (r.exec ("\u0011") == "\u0011");
|
||||
|
||||
r = /\c3/;
|
||||
assert (r.exec ("\\c3") == "\\c3");
|
||||
|
||||
r = /\cIasd/;
|
||||
assert (r.exec ("\tasd") == "\tasd");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user