WebAssembly: We still have some incorrect parsing productions inside unreachable...
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 17 Dec 2016 03:19:48 +0000 (03:19 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 17 Dec 2016 03:19:48 +0000 (03:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=165981

Reviewed by Keith Miller.

This hardens our parsing for CallIndirect and Loop/Block/If to be exactly like their reachable variant.

It also fixes a more nefarious bug in which we were decoding an extra varuint32
for Br/BrIf inside unreachable code.

* wasm/WasmFunctionParser.h:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/WasmFunctionParser.h

index 03d6732..f8c7af2 100644 (file)
@@ -1,3 +1,17 @@
+2016-12-16  Saam Barati  <sbarati@apple.com>
+
+        WebAssembly: We still have some incorrect parsing productions inside unreachable code
+        https://bugs.webkit.org/show_bug.cgi?id=165981
+
+        Reviewed by Keith Miller.
+
+        This hardens our parsing for CallIndirect and Loop/Block/If to be exactly like their reachable variant.
+        
+        It also fixes a more nefarious bug in which we were decoding an extra varuint32
+        for Br/BrIf inside unreachable code.
+
+        * wasm/WasmFunctionParser.h:
+
 2016-12-16  Filip Pizlo  <fpizlo@apple.com>
 
         CellState should have members with accurate names
index 8dd282d..e61e337 100644 (file)
@@ -527,8 +527,8 @@ auto FunctionParser<Context>::parseUnreachableExpression(OpType op) -> PartialRe
     case If:
     case Block: {
         m_unreachableBlocks++;
-        int8_t unused;
-        WASM_PARSER_FAIL_IF(!parseInt7(unused), "can't get inline type for ", op, " in unreachable context");
+        Type unused;
+        WASM_PARSER_FAIL_IF(!parseResultType(unused), "can't get inline type for ", op, " in unreachable context");
         return { };
     }
 
@@ -545,13 +545,17 @@ auto FunctionParser<Context>::parseUnreachableExpression(OpType op) -> PartialRe
         return { };
     }
 
+    case CallIndirect: {
+        uint32_t unused;
+        uint8_t unused2;
+        WASM_PARSER_FAIL_IF(!parseVarUInt32(unused), "can't get call_indirect's signature index in unreachable context");
+        WASM_PARSER_FAIL_IF(!parseVarUInt1(unused2), "can't get call_indirect's reserved byte in unreachable context");
+        return { };
+    }
 
     // two immediate cases
     FOR_EACH_WASM_MEMORY_LOAD_OP(CREATE_CASE)
-    FOR_EACH_WASM_MEMORY_STORE_OP(CREATE_CASE)
-    case Br:
-    case BrIf:
-    case CallIndirect: {
+    FOR_EACH_WASM_MEMORY_STORE_OP(CREATE_CASE) {
         uint32_t unused;
         WASM_PARSER_FAIL_IF(!parseVarUInt32(unused), "can't get first immediate for ", op, " in unreachable context");
         WASM_PARSER_FAIL_IF(!parseVarUInt32(unused), "can't get second immediate for ", op, " in unreachable context");
@@ -568,6 +572,8 @@ auto FunctionParser<Context>::parseUnreachableExpression(OpType op) -> PartialRe
     case TeeLocal:
     case GetGlobal:
     case SetGlobal:
+    case Br:
+    case BrIf:
     case Call: {
         uint32_t unused;
         WASM_PARSER_FAIL_IF(!parseVarUInt32(unused), "can't get immediate for ", op, " in unreachable context");