зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1368844: Check WebAssembly.{Memory,Table} sizes against internal limits; r=luke
MozReview-Commit-ID: GZSVjza1RfL --HG-- extra : rebase_source : 6605bb3f911a87ce0b46920873a9db73880bec0a
This commit is contained in:
Родитель
064920e81e
Коммит
54b6961485
|
@ -131,14 +131,17 @@ wasmEvalText('(module (import $foo "a" "" (result f64)))', {a:{"":()=>{}}});
|
|||
|
||||
wasmValidateText('(module (memory 0))');
|
||||
wasmValidateText('(module (memory 1))');
|
||||
wasmFailValidateText('(module (memory 65536))', /initial memory size too big/);
|
||||
wasmValidateText('(module (memory 16384))');
|
||||
wasmFailValidateText('(module (memory 16385))', /initial memory size too big/);
|
||||
|
||||
wasmEvalText('(module (memory 0 65536))')
|
||||
wasmFailValidateText('(module (memory 0 65537))', /maximum memory size too big/);
|
||||
|
||||
// May OOM, but must not crash:
|
||||
try {
|
||||
wasmEvalText('(module (memory 65535))');
|
||||
wasmEvalText('(module (memory 16384))');
|
||||
} catch (e) {
|
||||
assertEq(String(e).indexOf("out of memory") != -1 ||
|
||||
String(e).indexOf("memory size too big") != -1, true);
|
||||
assertEq(String(e).indexOf("out of memory") !== -1, true);
|
||||
}
|
||||
|
||||
var buf = wasmEvalText('(module (memory 1) (export "memory" memory))').exports.memory.buffer;
|
||||
|
|
|
@ -19,8 +19,27 @@ const tab2Elem = new Table({initial:2, element:"anyfunc"});
|
|||
const tab3Elem = new Table({initial:3, element:"anyfunc"});
|
||||
const tab4Elem = new Table({initial:4, element:"anyfunc"});
|
||||
|
||||
// Memory size consistency and internal limits.
|
||||
assertErrorMessage(() => new Memory({initial:2, maximum:1}), RangeError, /bad Memory maximum size/);
|
||||
|
||||
try {
|
||||
new Memory({initial:16384});
|
||||
} catch(e) {
|
||||
assertEq(String(e).indexOf("out of memory") !== -1, true);
|
||||
}
|
||||
|
||||
assertErrorMessage(() => new Memory({initial: 16385}), RangeError, /bad Memory initial size/);
|
||||
|
||||
new Memory({initial: 0, maximum: 65536});
|
||||
assertErrorMessage(() => new Memory({initial: 0, maximum: 65537}), RangeError, /bad Memory maximum size/);
|
||||
|
||||
// Table size consistency and internal limits.
|
||||
assertErrorMessage(() => new Table({initial:2, maximum:1, element:"anyfunc"}), RangeError, /bad Table maximum size/);
|
||||
new Table({ initial: 10000000, element:"anyfunc" });
|
||||
assertErrorMessage(() => new Table({initial:10000001, element:"anyfunc"}), RangeError, /bad Table initial size/);
|
||||
new Table({ initial: 0, maximum: 2**32 - 1, element:"anyfunc" });
|
||||
assertErrorMessage(() => new Table({initial:0, maximum: 2**32, element:"anyfunc"}), RangeError, /bad Table maximum size/);
|
||||
|
||||
const m1 = new Module(wasmTextToBinary('(module (import "foo" "bar") (import "baz" "quux"))'));
|
||||
assertErrorMessage(() => new Instance(m1), TypeError, /second argument must be an object/);
|
||||
assertErrorMessage(() => new Instance(m1, {foo:null}), TypeError, /import object field 'foo' is not an Object/);
|
||||
|
|
|
@ -274,10 +274,6 @@ for (var foldOffsets = 0; foldOffsets <= 1; foldOffsets++) {
|
|||
wasmFailValidateText('(module (memory 1) (func (i32.store offset=0 (i32.const 0) (f32.const 0))))', mismatchError("f32", "i32"));
|
||||
wasmFailValidateText('(module (memory 1) (func (i32.store offset=0 (i32.const 0) (f64.const 0))))', mismatchError("f64", "i32"));
|
||||
|
||||
wasmEvalText('(module (memory 0 65535))')
|
||||
wasmEvalText('(module (memory 0 65536))')
|
||||
wasmFailValidateText('(module (memory 0 65537))', /maximum memory size too big/);
|
||||
|
||||
// Test high charge of registers
|
||||
function testRegisters() {
|
||||
assertEq(wasmEvalText(
|
||||
|
|
|
@ -710,6 +710,7 @@ ArrayBufferObject::createForWasm(JSContext* cx, uint32_t initialSize,
|
|||
{
|
||||
MOZ_ASSERT(initialSize % wasm::PageSize == 0);
|
||||
MOZ_RELEASE_ASSERT(wasm::HaveSignalHandlers());
|
||||
MOZ_RELEASE_ASSERT((initialSize / wasm::PageSize) <= wasm::MaxMemoryInitialPages);
|
||||
|
||||
// Prevent applications specifying a large max (like UINT32_MAX) from
|
||||
// unintentially OOMing the browser on 32-bit: they just want "a lot of
|
||||
|
|
|
@ -423,8 +423,7 @@ ToNonWrappingUint32(JSContext* cx, HandleValue v, uint32_t max, const char* kind
|
|||
return false;
|
||||
|
||||
if (dbl < 0 || dbl > max) {
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_UINT32,
|
||||
kind, noun);
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_UINT32, kind, noun);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -434,8 +433,8 @@ ToNonWrappingUint32(JSContext* cx, HandleValue v, uint32_t max, const char* kind
|
|||
}
|
||||
|
||||
static bool
|
||||
GetLimits(JSContext* cx, HandleObject obj, uint32_t max, const char* kind,
|
||||
Limits* limits)
|
||||
GetLimits(JSContext* cx, HandleObject obj, uint32_t maxInitial, uint32_t maxMaximum,
|
||||
const char* kind, Limits* limits)
|
||||
{
|
||||
JSAtom* initialAtom = Atomize(cx, "initial", strlen("initial"));
|
||||
if (!initialAtom)
|
||||
|
@ -446,7 +445,7 @@ GetLimits(JSContext* cx, HandleObject obj, uint32_t max, const char* kind,
|
|||
if (!GetProperty(cx, obj, obj, initialId, &initialVal))
|
||||
return false;
|
||||
|
||||
if (!ToNonWrappingUint32(cx, initialVal, max, kind, "initial size", &limits->initial))
|
||||
if (!ToNonWrappingUint32(cx, initialVal, maxInitial, kind, "initial size", &limits->initial))
|
||||
return false;
|
||||
|
||||
JSAtom* maximumAtom = Atomize(cx, "maximum", strlen("maximum"));
|
||||
|
@ -461,7 +460,7 @@ GetLimits(JSContext* cx, HandleObject obj, uint32_t max, const char* kind,
|
|||
return false;
|
||||
|
||||
limits->maximum.emplace();
|
||||
if (!ToNonWrappingUint32(cx, maxVal, max, kind, "maximum size", limits->maximum.ptr()))
|
||||
if (!ToNonWrappingUint32(cx, maxVal, maxMaximum, kind, "maximum size", limits->maximum.ptr()))
|
||||
return false;
|
||||
|
||||
if (limits->initial > *limits->maximum) {
|
||||
|
@ -1343,7 +1342,7 @@ WasmMemoryObject::construct(JSContext* cx, unsigned argc, Value* vp)
|
|||
|
||||
RootedObject obj(cx, &args[0].toObject());
|
||||
Limits limits;
|
||||
if (!GetLimits(cx, obj, UINT32_MAX / PageSize, "Memory", &limits))
|
||||
if (!GetLimits(cx, obj, MaxMemoryInitialPages, MaxMemoryMaximumPages, "Memory", &limits))
|
||||
return false;
|
||||
|
||||
limits.initial *= PageSize;
|
||||
|
@ -1654,7 +1653,7 @@ WasmTableObject::construct(JSContext* cx, unsigned argc, Value* vp)
|
|||
}
|
||||
|
||||
Limits limits;
|
||||
if (!GetLimits(cx, obj, UINT32_MAX, "Table", &limits))
|
||||
if (!GetLimits(cx, obj, MaxTableInitialLength, UINT32_MAX, "Table", &limits))
|
||||
return false;
|
||||
|
||||
RootedWasmTableObject table(cx, WasmTableObject::create(cx, limits));
|
||||
|
|
Загрузка…
Ссылка в новой задаче