Title: [280825] trunk
Revision
280825
Author
[email protected]
Date
2021-08-09 23:56:17 -0700 (Mon, 09 Aug 2021)

Log Message

[JSC] super-Latin1 white space and line terminator after regular _expression_ literal misinterpreted as flags
https://bugs.webkit.org/show_bug.cgi?id=227944

Reviewed by Alexey Shvayka.

JSTests:

* test262/expectations.yaml:

Source/_javascript_Core:

There are non-Latin1 white-spaces and line-terminators, but Lexer::scanRegExp's code did not assume that.
As a result, if there is a non-Latin1 white-spaces or line-terminators after RegExp, we raise SyntaxError
while this is valid. This patch fixes that.

* parser/Lexer.cpp:
(JSC::Lexer<T>::scanRegExp):

Modified Paths

Diff

Modified: trunk/JSTests/ChangeLog (280824 => 280825)


--- trunk/JSTests/ChangeLog	2021-08-10 03:33:03 UTC (rev 280824)
+++ trunk/JSTests/ChangeLog	2021-08-10 06:56:17 UTC (rev 280825)
@@ -1,3 +1,12 @@
+2021-08-09  Yusuke Suzuki  <[email protected]>
+
+        [JSC] super-Latin1 white space and line terminator after regular _expression_ literal misinterpreted as flags
+        https://bugs.webkit.org/show_bug.cgi?id=227944
+
+        Reviewed by Alexey Shvayka.
+
+        * test262/expectations.yaml:
+
 2021-08-08  Yusuke Suzuki  <[email protected]>
 
         [JSC] Clean up test262 expectations

Modified: trunk/JSTests/test262/expectations.yaml (280824 => 280825)


--- trunk/JSTests/test262/expectations.yaml	2021-08-10 03:33:03 UTC (rev 280824)
+++ trunk/JSTests/test262/expectations.yaml	2021-08-10 06:56:17 UTC (rev 280825)
@@ -1960,57 +1960,3 @@
 test/language/statements/variable/dstr/ary-ptrn-elem-id-iter-val-array-prototype.js:
   default: 'Test262Error: Expected SameValue(«3», «42») to be true'
   strict mode: 'Test262Error: Expected SameValue(«3», «42») to be true'
-test/language/white-space/after-regular-_expression_-literal-em-quad.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-em-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-en-quad.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-en-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-figure-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-four-per-em-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-hair-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-ideographic-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-line-separator.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g
'"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g
'"
-test/language/white-space/after-regular-_expression_-literal-medium-mathematical-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-nnbsp.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-ogham-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-paragraph-separator.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g
'"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g
'"
-test/language/white-space/after-regular-_expression_-literal-punctuation-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-six-per-em-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-thin-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-three-per-em-space.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g '"
-test/language/white-space/after-regular-_expression_-literal-zwnbsp.js:
-  default: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g'"
-  strict mode: "SyntaxError: Invalid non-latin character in RexExp literal's flags '/x/g'"

Modified: trunk/Source/_javascript_Core/ChangeLog (280824 => 280825)


--- trunk/Source/_javascript_Core/ChangeLog	2021-08-10 03:33:03 UTC (rev 280824)
+++ trunk/Source/_javascript_Core/ChangeLog	2021-08-10 06:56:17 UTC (rev 280825)
@@ -1,3 +1,17 @@
+2021-08-09  Yusuke Suzuki  <[email protected]>
+
+        [JSC] super-Latin1 white space and line terminator after regular _expression_ literal misinterpreted as flags
+        https://bugs.webkit.org/show_bug.cgi?id=227944
+
+        Reviewed by Alexey Shvayka.
+
+        There are non-Latin1 white-spaces and line-terminators, but Lexer::scanRegExp's code did not assume that.
+        As a result, if there is a non-Latin1 white-spaces or line-terminators after RegExp, we raise SyntaxError
+        while this is valid. This patch fixes that.
+
+        * parser/Lexer.cpp:
+        (JSC::Lexer<T>::scanRegExp):
+
 2021-08-09  Michael Catanzaro  <[email protected]>
 
         Fix yet another -Wreturn-type warning

Modified: trunk/Source/_javascript_Core/parser/Lexer.cpp (280824 => 280825)


--- trunk/Source/_javascript_Core/parser/Lexer.cpp	2021-08-10 03:33:03 UTC (rev 280824)
+++ trunk/Source/_javascript_Core/parser/Lexer.cpp	2021-08-10 06:56:17 UTC (rev 280825)
@@ -2657,7 +2657,7 @@
     }
 
     // Normally this would not be a lex error but dealing with surrogate pairs here is annoying and it's going to be an error anyway...
-    if (UNLIKELY(!isLatin1(m_current))) {
+    if (UNLIKELY(!isLatin1(m_current) && !isWhiteSpace(m_current) && !isLineTerminator(m_current))) {
         m_buffer8.shrink(0);
         JSTokenType token = INVALID_IDENTIFIER_UNICODE_ERRORTOK;
         fillTokenInfo(tokenRecord, token, m_lineNumber, currentOffset(), currentLineStartOffset(), currentPosition());
@@ -2672,7 +2672,7 @@
     tokenData->flags = makeIdentifier(m_buffer8.data(), m_buffer8.size());
     m_buffer8.shrink(0);
 
-    // Since RegExp always ends with /, m_atLineStart always becomes false.
+    // Since RegExp always ends with / or flags (IdentifierPart), m_atLineStart always becomes false.
     m_atLineStart = false;
 
     JSTokenType token = REGEXP;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to