cecd2ed5b7
There was a bug in WebAssembly.instantiate in the case where a CSP disallows WebAssembly compilation. In this case the promise returned by WebAssembly.instantiate was rejected immediately because of the CSP, but then compilation was started anyways, and the promise was resolved after compilation for a second time, which caused the crash. With this CL we do not start compilation if CSP disallows WebAssembly compilation. R=clemensh@chromium.org Bug: chromium:881978 Change-Id: Iffdb3e02c3006eb7f86211ab197f81cf20438f0e Reviewed-on: https://chromium-review.googlesource.com/1219706 Commit-Queue: Andreas Haas <ahaas@chromium.org> Reviewed-by: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#55788}
205 lines
5.7 KiB
JavaScript
205 lines
5.7 KiB
JavaScript
// Copyright 2017 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --expose-wasm --allow-natives-syntax
|
|
|
|
load("test/mjsunit/wasm/wasm-constants.js");
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
let kReturnValue = 19;
|
|
|
|
let buffer = (function CreateBuffer() {
|
|
let builder = new WasmModuleBuilder();
|
|
builder.addMemory(1, 1, true);
|
|
builder.addFunction('main', kSig_i_v)
|
|
.addBody([kExprI32Const, kReturnValue])
|
|
.exportFunc();
|
|
|
|
return builder.toBuffer();
|
|
})();
|
|
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(true);
|
|
|
|
async function SyncTestOk() {
|
|
print('sync module compile (ok)...');
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
let module = new WebAssembly.Module(buffer);
|
|
assertInstanceof(module, WebAssembly.Module);
|
|
}
|
|
|
|
async function SyncTestFail() {
|
|
print('sync module compile (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
try {
|
|
let module = new WebAssembly.Module(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function SyncTestWasmFail(disallow_codegen) {
|
|
print('sync wasm module compile (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
try {
|
|
let module = new WebAssembly.Module(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function AsyncTestOk() {
|
|
print('async module compile (ok)...');
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
let promise = WebAssembly.compile(buffer);
|
|
assertPromiseResult(
|
|
promise, module => assertInstanceof(module, WebAssembly.Module));
|
|
}
|
|
|
|
async function AsyncTestWithInstantiateOk() {
|
|
print('async module instantiate (ok)...');
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
let promise = WebAssembly.instantiate(buffer);
|
|
assertPromiseResult(
|
|
promise,
|
|
module => assertInstanceof(module.instance, WebAssembly.Instance));
|
|
}
|
|
|
|
async function AsyncTestFail() {
|
|
print('async module compile (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
try {
|
|
let m = await WebAssembly.compile(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function AsyncTestWithInstantiateFail() {
|
|
print('async module instantiate (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
try {
|
|
let m = await WebAssembly.instantiate(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function AsyncTestWasmFail(disallow_codegen) {
|
|
print('async wasm module compile (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
try {
|
|
let m = await WebAssembly.compile(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function AsyncTestWasmWithInstantiateFail(disallow_codegen) {
|
|
print('async wasm module instantiate (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
try {
|
|
let m = await WebAssembly.instantiate(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function StreamingTestOk() {
|
|
print('streaming module compile (ok)...');
|
|
// TODO(titzer): compileStreaming must be supplied by embedder.
|
|
// (and it takes a response, not a buffer)
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
if ("Function" != typeof WebAssembly.compileStreaming) {
|
|
print(" no embedder for streaming compilation");
|
|
return;
|
|
}
|
|
let promise = WebAssembly.compileStreaming(buffer);
|
|
assertPromiseResult(
|
|
promise, module => assertInstanceof(module, WebAssembly.Module));
|
|
}
|
|
|
|
async function StreamingTestFail() {
|
|
print('streaming module compile (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
// TODO(titzer): compileStreaming must be supplied by embedder.
|
|
// (and it takes a response, not a buffer)
|
|
if ("Function" != typeof WebAssembly.compileStreaming) {
|
|
print(" no embedder for streaming compilation");
|
|
return;
|
|
}
|
|
try {
|
|
let m = await WebAssembly.compileStreaming(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
|
|
async function StreamingTestWasmFail(disallow_codegen) {
|
|
print('streaming wasm module compile (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
// TODO(titzer): compileStreaming must be supplied by embedder.
|
|
// (and it takes a response, not a buffer)
|
|
if ("Function" != typeof WebAssembly.compileStreaming) {
|
|
print(" no embedder for streaming compilation");
|
|
return;
|
|
}
|
|
try {
|
|
let m = await WebAssembly.compileStreaming(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function RunAll() {
|
|
await SyncTestOk();
|
|
await SyncTestFail();
|
|
await AsyncTestOk();
|
|
await AsyncTestWithInstantiateOk();
|
|
await AsyncTestFail();
|
|
await AsyncTestWithInstantiateFail();
|
|
await StreamingTestOk();
|
|
await StreamingTestFail();
|
|
|
|
disallow_codegen = false;
|
|
for (count = 0; count < 2; ++count) {
|
|
SyncTestWasmFail(disallow_codegen);
|
|
AsyncTestWasmFail(disallow_codegen);
|
|
AsyncTestWasmWithInstantiateFail(disallow_codegen);
|
|
StreamingTestWasmFail(disallow_codegen)
|
|
disallow_codegen = true;
|
|
}
|
|
}
|
|
|
|
assertPromiseResult(RunAll());
|