Browse Source

fix: in `Emit()`, don't leak converted Arg `Local<Values>` into caller's scope (#43749)

fix: Emit() should not leak converted arg handles into caller's HandleScope

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Charles Kerr <[email protected]>
trop[bot] 7 months ago
parent
commit
cece35555a
1 changed files with 6 additions and 3 deletions
  1. 6 3
      shell/common/gin_helper/event_emitter_caller.h

+ 6 - 3
shell/common/gin_helper/event_emitter_caller.h

@@ -44,11 +44,13 @@ v8::Local<v8::Value> EmitEvent(v8::Isolate* isolate,
                                v8::Local<v8::Object> obj,
                                const StringType& name,
                                Args&&... args) {
+  v8::EscapableHandleScope scope{isolate};
   internal::ValueVector converted_args = {
       gin::StringToV8(isolate, name),
       gin::ConvertToV8(isolate, std::forward<Args>(args))...,
   };
-  return internal::CallMethodWithArgs(isolate, obj, "emit", &converted_args);
+  return scope.Escape(
+      internal::CallMethodWithArgs(isolate, obj, "emit", &converted_args));
 }
 
 // obj.custom_emit(args...)
@@ -57,11 +59,12 @@ v8::Local<v8::Value> CustomEmit(v8::Isolate* isolate,
                                 v8::Local<v8::Object> object,
                                 const char* custom_emit,
                                 Args&&... args) {
+  v8::EscapableHandleScope scope{isolate};
   internal::ValueVector converted_args = {
       gin::ConvertToV8(isolate, std::forward<Args>(args))...,
   };
-  return internal::CallMethodWithArgs(isolate, object, custom_emit,
-                                      &converted_args);
+  return scope.Escape(internal::CallMethodWithArgs(isolate, object, custom_emit,
+                                                   &converted_args));
 }
 
 template <typename T, typename... Args>