Destructuring variable declaration is missing a validation of the syntax of a sub...
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Jun 2016 21:48:17 +0000 (21:48 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Jun 2016 21:48:17 +0000 (21:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=159267

Reviewed by Mark Lam.

Source/JavaScriptCore:

We were parsing something without checking if it had a syntax error.
This is wrong for many reasons, but it could actually cause a crash
in a debug build if you parsed particular programs.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parseVariableDeclarationList):

LayoutTests:

* js/parser-syntax-check-expected.txt:
* js/script-tests/parser-syntax-check.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@202648 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/js/parser-syntax-check-expected.txt
LayoutTests/js/script-tests/parser-syntax-check.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index 4489203..913fb1c 100644 (file)
@@ -1,3 +1,13 @@
+2016-06-29  Saam barati  <sbarati@apple.com>
+
+        Destructuring variable declaration is missing a validation of the syntax of a sub production when there is a rhs
+        https://bugs.webkit.org/show_bug.cgi?id=159267
+
+        Reviewed by Mark Lam.
+
+        * js/parser-syntax-check-expected.txt:
+        * js/script-tests/parser-syntax-check.js:
+
 2016-06-29  Nan Wang  <n_wang@apple.com>
 
         AX: Crash in WebCore::Document::focusNavigationStartingNode(WebCore::FocusDirection) const + 128
index 76312a4..9ce06c9 100644 (file)
@@ -1099,6 +1099,20 @@ PASS Invalid: "1 %
 --"
 PASS Invalid: "function f() { 1 % 
 -- }"
+PASS Invalid: "let {w} = (foo-=()), {} = ("a" ^= "b");"
+PASS Invalid: "function f() { let {w} = (foo-=()), {} = ("a" ^= "b"); }"
+PASS Invalid: "const {w} = (foo-=()), {} = ("a" ^= "b");"
+PASS Invalid: "function f() { const {w} = (foo-=()), {} = ("a" ^= "b"); }"
+PASS Invalid: "var {w} = (foo-=()), {} = ("a" ^= "b");"
+PASS Invalid: "function f() { var {w} = (foo-=()), {} = ("a" ^= "b"); }"
+PASS Invalid: "let {w} = ();"
+PASS Invalid: "function f() { let {w} = (); }"
+PASS Invalid: "let {w} = 1234abc;"
+PASS Invalid: "function f() { let {w} = 1234abc; }"
+PASS Invalid: "const {w} = 1234abc;"
+PASS Invalid: "function f() { const {w} = 1234abc; }"
+PASS Invalid: "var {w} = 1234abc;"
+PASS Invalid: "function f() { var {w} = 1234abc; }"
 Rest parameter
 PASS Valid:   "function foo(...a) { }"
 PASS Valid:   "function f() { function foo(...a) { } }"
index 2a3f674..1a01b12 100644 (file)
@@ -657,6 +657,13 @@ invalid("1 % ++");
 invalid("1 % --");
 invalid("1 % \n++");
 invalid("1 % \n--");
+invalid('let {w} = (foo-=()), {} = ("a" ^= "b");');
+invalid('const {w} = (foo-=()), {} = ("a" ^= "b");');
+invalid('var {w} = (foo-=()), {} = ("a" ^= "b");');
+invalid('let {w} = ();');
+invalid('let {w} = 1234abc;');
+invalid('const {w} = 1234abc;');
+invalid('var {w} = 1234abc;');
 
 debug("Rest parameter");
 valid("function foo(...a) { }");
index 479d43f..480d2fe 100644 (file)
@@ -1,3 +1,17 @@
+2016-06-29  Saam barati  <sbarati@apple.com>
+
+        Destructuring variable declaration is missing a validation of the syntax of a sub production when there is a rhs
+        https://bugs.webkit.org/show_bug.cgi?id=159267
+
+        Reviewed by Mark Lam.
+
+        We were parsing something without checking if it had a syntax error.
+        This is wrong for many reasons, but it could actually cause a crash
+        in a debug build if you parsed particular programs.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseVariableDeclarationList):
+
 2016-06-29  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector: Show Shadow Root type in DOM Tree
index b6c8779..7f96ba4 100644 (file)
@@ -733,6 +733,8 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseVariableDecl
             if (hasInitializer) {
                 next(TreeBuilder::DontBuildStrings); // consume '='
                 TreeExpression rhs = parseAssignmentExpression(context);
+                propagateError();
+                ASSERT(rhs);
                 node = context.createDestructuringAssignment(location, pattern, rhs);
                 lastInitializer = rhs;
             }