瀏覽代碼

LibWeb: Ensure an ESO is pushed before doing structured deserialization

We need to make sure that the given target realm is at the top of the
VM's execution context stack before doing any JS object construction
based on the data in our serialized buffer.
Andrew Kaster 1 年之前
父節點
當前提交
2c27b4e63c
共有 1 個文件被更改,包括 9 次插入1 次删除
  1. 9 1
      Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp

+ 9 - 1
Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp

@@ -1142,8 +1142,16 @@ WebIDL::ExceptionOr<JS::Value> structured_deserialize(JS::VM& vm, SerializationR
     if (!memory.has_value())
         memory = DeserializationMemory { vm.heap() };
 
+    // IMPLEMENTATION DEFINED: We need to make sure there's an execution context for target_realm on the stack before constructing these JS objects
+    auto& target_settings = Bindings::host_defined_environment_settings_object(target_realm);
+    target_settings.prepare_to_run_script();
+
     Deserializer deserializer(vm, target_realm, serialized.span(), *memory);
-    return deserializer.deserialize();
+
+    auto result = deserializer.deserialize();
+
+    target_settings.clean_up_after_running_script();
+    return result;
 }
 
 }