Skip to content

Commit c4c9b7f

Browse files
committed
Fix invalid control escapes during RegExp parsing.
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai.u-szeged@partner.samsung.com
1 parent f2c846d commit c4c9b7f

File tree

2 files changed

+46
-20
lines changed

2 files changed

+46
-20
lines changed

jerry-core/parser/regexp/re-parser.cpp

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -378,18 +378,22 @@ re_parse_char_class (re_parser_ctx_t *parser_ctx_p, /**< number of classes */
378378
}
379379
else if (ch == LIT_CHAR_LOWERCASE_C)
380380
{
381-
if (lit_utf8_iterator_is_eos (iter_p))
381+
if (!lit_utf8_iterator_is_eos (iter_p))
382382
{
383-
return ecma_raise_syntax_error ("invalid character class, end of string after '\\c'");
384-
}
385-
386-
ch = lit_utf8_iterator_read_next (iter_p);
383+
ch = lit_utf8_iterator_peek_next (iter_p);
387384

388-
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
389-
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END))
390-
{
391-
/* See ECMA-262 v5, 15.10.2.10 (Point 3) */
392-
ch = (ch % 32);
385+
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
386+
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END)
387+
|| (ch >= LIT_CHAR_0 && ch <= LIT_CHAR_9))
388+
{
389+
/* See ECMA-262 v5, 15.10.2.10 (Point 3) */
390+
ch = (ch % 32);
391+
lit_utf8_iterator_incr (iter_p);
392+
}
393+
else
394+
{
395+
ch = LIT_CHAR_LOWERCASE_C;
396+
}
393397
}
394398
}
395399
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 *
627631
}
628632
else if (ch == LIT_CHAR_LOWERCASE_C)
629633
{
630-
if (lit_utf8_iterator_is_eos (iter_p))
634+
if (!lit_utf8_iterator_is_eos (iter_p))
631635
{
632-
out_token_p->value = ch;
633-
break;
634-
}
635-
636-
ch = lit_utf8_iterator_peek_next (iter_p);
636+
ch = lit_utf8_iterator_peek_next (iter_p);
637637

638-
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
639-
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END))
638+
if ((ch >= LIT_CHAR_ASCII_UPPERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_UPPERCASE_LETTERS_END)
639+
|| (ch >= LIT_CHAR_ASCII_LOWERCASE_LETTERS_BEGIN && ch <= LIT_CHAR_ASCII_LOWERCASE_LETTERS_END))
640+
{
641+
out_token_p->value = (ch % 32);
642+
lit_utf8_iterator_incr (iter_p);
643+
}
644+
else
645+
{
646+
out_token_p->value = LIT_CHAR_BACKSLASH;
647+
lit_utf8_iterator_decr (iter_p);
648+
}
649+
}
650+
else
640651
{
641-
out_token_p->value = (ch % 32);
642-
lit_utf8_iterator_advance (iter_p, 1);
652+
out_token_p->value = LIT_CHAR_BACKSLASH;
653+
lit_utf8_iterator_decr (iter_p);
643654
}
644655
}
645656
else if (ch == LIT_CHAR_LOWERCASE_X

tests/jerry/regexp-simple-atom-and-iterations.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,18 @@ assert (/([abc]+)\40([d-f]+)\12\1/.exec("abc def\nabc") == "abc def\nabc,abc,def
7474

7575
var expected = "8765432911,8,7,6,5,4,3,2,9,1";
7676
assert (/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)\9(\d)\9/.exec("8765432911") == expected);
77+
78+
r = /\c/;
79+
assert (r.exec ("\\c") == "\\c");
80+
81+
r = /[\c]/;
82+
assert (r.exec ("c") == "c");
83+
84+
r = /[\c1]/;
85+
assert (r.exec ("\u0011") == "\u0011");
86+
87+
r = /\c3/;
88+
assert (r.exec ("\\c3") == "\\c3");
89+
90+
r = /\cIasd/;
91+
assert (r.exec ("\tasd") == "\tasd");

0 commit comments

Comments
 (0)