Skip to content

Commit f95b7cb

Browse files
committed
[1.6>1.7] [MERGE #3469 @Cellule] WASM: reserved immediates
Merge pull request #3469 from Cellule:users/micfer/wasm/reserved Make sure reserved value are 0 Fixes #3450
2 parents 95f497c + 0d52124 commit f95b7cb

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

lib/WasmReader/WasmBinaryReader.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,18 @@ WasmOp WasmBinaryReader::ReadExpr()
424424
break;
425425
case wbCurrentMemory:
426426
case wbGrowMemory:
427+
{
427428
// Reserved value currently unused
428-
ReadConst<uint8>();
429+
uint8 reserved = ReadConst<uint8>();
430+
if (reserved != 0)
431+
{
432+
ThrowDecodingError(op == wbCurrentMemory
433+
? _u("current_memory reserved value must be 0")
434+
: _u("grow_memory reserved value must be 0")
435+
);
436+
}
429437
break;
438+
}
430439
#define WASM_MEM_OPCODE(opname, opcode, sig, nyi) \
431440
case wb##opname: \
432441
MemNode(); \
@@ -493,7 +502,11 @@ void WasmBinaryReader::CallIndirectNode()
493502

494503
uint32 funcNum = LEB128(length);
495504
// Reserved value currently unused
496-
ReadConst<uint8>();
505+
uint8 reserved = ReadConst<uint8>();
506+
if (reserved != 0)
507+
{
508+
ThrowDecodingError(_u("call_indirect reserved value must be 0"));
509+
}
497510
if (!m_module->HasTable() && !m_module->HasTableImport())
498511
{
499512
ThrowDecodingError(_u("Found call_indirect operator, but no table"));

test/wasm/binary.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
/* global assert,testRunner */ // eslint rule
7+
WScript.LoadScriptFile("../UnitTestFrameWork/UnitTestFrameWork.js");
8+
WScript.LoadScriptFile("../wasmspec/testsuite/harness/wasm-constants.js");
9+
WScript.LoadScriptFile("../wasmspec/testsuite/harness/wasm-module-builder.js");
10+
WScript.Flag("-off:wasmdeferred");
11+
12+
function makeReservedTest(name, body, msg) {
13+
return {
14+
name,
15+
body() {
16+
const builder = new WasmModuleBuilder();
17+
builder.addFunction(null, kSig_v_i).addBody(body);
18+
try {
19+
new WebAssembly.Module(builder.toBuffer());
20+
assert.fail("Expected an exception");
21+
} catch (e) {
22+
if (!(e instanceof WebAssembly.CompileError) || RegExp(msg, "i").test(e.message)) {
23+
return;
24+
}
25+
assert.fail(`Expected error message: ${msg}. Got ${e.message}`);
26+
}
27+
}
28+
}
29+
}
30+
31+
const tests = [
32+
makeReservedTest("current_memory reserved", [kExprMemorySize, 1], "current_memory reserved value must be 0"),
33+
makeReservedTest("grow_memory reserved", [kExprGrowMemory, 1], "grow_memory reserved value must be 0"),
34+
makeReservedTest("call_indirect reserved", [kExprCallIndirect, 1], "call_indirect reserved value must be 0"),
35+
];
36+
37+
WScript.LoadScriptFile("../UnitTestFrameWork/yargs.js");
38+
const argv = yargsParse(WScript.Arguments, {
39+
boolean: ["verbose"],
40+
number: ["start", "end"],
41+
default: {
42+
verbose: true,
43+
start: 0,
44+
end: tests.length
45+
}
46+
}).argv;
47+
48+
const todoTests = tests
49+
.slice(argv.start, argv.end);
50+
51+
testRunner.run(todoTests, {verbose: argv.verbose});

test/wasm/rlexe.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,13 @@
281281
<tags>exclude_xplat,exclude_jshost,exclude_win7</tags>
282282
</default>
283283
</test>
284+
<test>
285+
<default>
286+
<files>binary.js</files>
287+
<compile-flags>-wasm -args --no-verbose -endargs</compile-flags>
288+
<tags>exclude_xplat</tags>
289+
</default>
290+
</test>
284291
<test>
285292
<default>
286293
<files>limits.js</files>

0 commit comments

Comments
 (0)