Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1209)

Unified Diff: src/wasm/wasm-js.cc

Issue 2699843003: [wasm] Embedder can control what buffers wasm compilation works on. (Closed)
Patch Set: RangeError Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/wasm/wasm-js.cc
diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc
index baec27d3cc5661af4d47b0a9bfc8d71c332c63ef..0cdb3987db5afb74cee8a45561f758502d6c7a67 100644
--- a/src/wasm/wasm-js.cc
+++ b/src/wasm/wasm-js.cc
@@ -79,9 +79,17 @@ RawBuffer GetRawBufferSource(
static i::MaybeHandle<i::WasmModuleObject> CreateModuleObject(
v8::Isolate* isolate, const v8::Local<v8::Value> source,
- ErrorThrower* thrower) {
+ ErrorThrower* thrower, bool async) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
- i::MaybeHandle<i::JSObject> nothing;
+ i::MaybeHandle<i::WasmModuleObject> nothing;
+
+ AllowWasmCompileCallback callback =
+ reinterpret_cast<i::Isolate*>(isolate)->allow_wasm_compile_callback();
+ if (callback != nullptr && !callback(source, async)) {
+ thrower->RangeError(
+ "Wasm compilation disallowed in this context for provided argument");
bradnelson 2017/02/18 00:28:42 How about: Wasm compilation exceeds internal limit
Mircea Trofin 2017/02/18 00:41:47 Done.
+ return nothing;
+ }
RawBuffer buffer = GetRawBufferSource(source, thrower);
if (buffer.start == nullptr) return i::MaybeHandle<i::WasmModuleObject>();
@@ -139,7 +147,7 @@ void WebAssemblyCompile(const v8::FunctionCallbackInfo<v8::Value>& args) {
return;
}
i::MaybeHandle<i::JSObject> module_obj =
- CreateModuleObject(isolate, args[0], &thrower);
+ CreateModuleObject(isolate, args[0], &thrower, true);
if (thrower.error()) {
resolver->Reject(context, Utils::ToLocal(thrower.Reify()));
@@ -180,7 +188,7 @@ void WebAssemblyModule(const v8::FunctionCallbackInfo<v8::Value>& args) {
}
i::MaybeHandle<i::JSObject> module_obj =
- CreateModuleObject(isolate, args[0], &thrower);
+ CreateModuleObject(isolate, args[0], &thrower, false);
if (module_obj.is_null()) return;
v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
@@ -189,7 +197,8 @@ void WebAssemblyModule(const v8::FunctionCallbackInfo<v8::Value>& args) {
MaybeLocal<Value> InstantiateModuleImpl(
i::Isolate* i_isolate, i::Handle<i::WasmModuleObject> i_module_obj,
- const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) {
+ const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower,
+ bool as_promise) {
// It so happens that in both the WebAssembly.instantiate, as well as
// WebAssembly.Instance ctor, the positions of the ffi object and memory
// are the same. If that changes later, we refactor the consts into
@@ -210,6 +219,16 @@ MaybeLocal<Value> InstantiateModuleImpl(
Local<Object> obj = Local<Object>::Cast(args[kFfiOffset]);
ffi = i::Handle<i::JSReceiver>::cast(v8::Utils::OpenHandle(*obj));
}
+ AllowWasmInstantiateCallback allow_instantiate =
+ i_isolate->allow_wasm_instantiate_callback();
+ if (allow_instantiate != nullptr &&
+ !allow_instantiate(Local<WasmCompiledModule>::Cast(Utils::ToLocal(
+ i::Handle<i::JSObject>::cast(i_module_obj))),
+ Utils::ToLocal(ffi), as_promise)) {
+ thrower->RangeError(
+ "WebAssembly Instantiation is not permitted in this context");
bradnelson 2017/02/18 00:28:42 How about: Wasm instantiation exceeds internal lim
Mircea Trofin 2017/02/18 00:41:47 Done.
+ return nothing;
+ }
i::MaybeHandle<i::JSObject> instance =
i::wasm::WasmModule::Instantiate(i_isolate, thrower, i_module_obj, ffi);
@@ -316,7 +335,7 @@ void WebAssemblyInstance(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (!maybe_module.is_null()) {
MaybeLocal<Value> instance = InstantiateModuleImpl(
- i_isolate, maybe_module.ToHandleChecked(), args, &thrower);
+ i_isolate, maybe_module.ToHandleChecked(), args, &thrower, false);
if (instance.IsEmpty()) {
DCHECK(thrower.error());
@@ -361,7 +380,7 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) {
i::Handle<i::WasmModuleObject> module_obj;
if (want_pair) {
i::MaybeHandle<i::WasmModuleObject> maybe_module_obj =
- CreateModuleObject(isolate, args[0], &thrower);
+ CreateModuleObject(isolate, args[0], &thrower, true);
if (!maybe_module_obj.ToHandle(&module_obj)) {
DCHECK(thrower.error());
resolver->Reject(context, Utils::ToLocal(thrower.Reify()));
@@ -372,7 +391,7 @@ void WebAssemblyInstantiate(const v8::FunctionCallbackInfo<v8::Value>& args) {
}
DCHECK(!module_obj.is_null());
MaybeLocal<Value> instance =
- InstantiateModuleImpl(i_isolate, module_obj, args, &thrower);
+ InstantiateModuleImpl(i_isolate, module_obj, args, &thrower, true);
if (instance.IsEmpty()) {
DCHECK(thrower.error());
resolver->Reject(context, Utils::ToLocal(thrower.Reify()));

Powered by Google App Engine
This is Rietveld 408576698