Pārlūkot izejas kodu

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 gadu atpakaļ
vecāks
revīzija
2c27b4e63c

+ 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())
     if (!memory.has_value())
         memory = DeserializationMemory { vm.heap() };
         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);
     Deserializer deserializer(vm, target_realm, serialized.span(), *memory);
-    return deserializer.deserialize();
+
+    auto result = deserializer.deserialize();
+
+    target_settings.clean_up_after_running_script();
+    return result;
 }
 }
 
 
 }
 }