script_binding: wrapper of JSAutoStructuredCloneBuffer (#38284)

Instead of using raw pointer of JSAutoStructuredCloneBuffer, use its
wrapper JSAutoStructuredCloneBufferWrapper, which implements the Drop
trait that can prevent leakage when structured cloning fails.

Testing: Refactoring. Existing tests should be enough.
Fixes: #37966

---------

Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
This commit is contained in:
Kingsley Yung 2025-07-27 20:41:02 +08:00 committed by GitHub
parent 633d746e2f
commit ab6e151c89
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 14 deletions

View file

@ -20,8 +20,7 @@ use constellation_traits::{
};
use js::gc::RootedVec;
use js::glue::{
CopyJSStructuredCloneData, DeleteJSAutoStructuredCloneBuffer, GetLengthOfJSStructuredCloneData,
NewJSAutoStructuredCloneBuffer, WriteBytesToJSStructuredCloneData,
CopyJSStructuredCloneData, GetLengthOfJSStructuredCloneData, WriteBytesToJSStructuredCloneData,
};
use js::jsapi::{
CloneDataPolicy, HandleObject as RawHandleObject, Heap, JS_IsExceptionPending,
@ -31,7 +30,9 @@ use js::jsapi::{
};
use js::jsval::UndefinedValue;
use js::rust::wrappers::{JS_ReadStructuredClone, JS_WriteStructuredClone};
use js::rust::{CustomAutoRooterGuard, HandleValue, MutableHandleValue};
use js::rust::{
CustomAutoRooterGuard, HandleValue, JSAutoStructuredCloneBufferWrapper, MutableHandleValue,
};
use script_bindings::conversions::{IDLInterface, SafeToJSValConvertible};
use strum::IntoEnumIterator;
@ -599,11 +600,11 @@ pub(crate) fn write(
let mut sc_writer = StructuredDataWriter::default();
let sc_writer_ptr = &mut sc_writer as *mut _;
let scbuf = NewJSAutoStructuredCloneBuffer(
let scbuf = JSAutoStructuredCloneBufferWrapper::new(
StructuredCloneScope::DifferentProcess,
&STRUCTURED_CLONE_CALLBACKS,
);
let scdata = &mut ((*scbuf).data_);
let scdata = &mut ((*scbuf.as_raw_ptr()).data_);
let policy = CloneDataPolicy {
allowIntraClusterClonableSharedObjects_: false,
allowSharedMemoryObjects_: false,
@ -633,8 +634,6 @@ pub(crate) fn write(
CopyJSStructuredCloneData(scdata, data.as_mut_ptr());
data.set_len(nbytes);
DeleteJSAutoStructuredCloneBuffer(scbuf);
let data = StructuredSerializedData {
serialized: data,
ports: sc_writer.ports.take(),
@ -675,11 +674,11 @@ pub(crate) fn read(
};
let sc_reader_ptr = &mut sc_reader as *mut _;
unsafe {
let scbuf = NewJSAutoStructuredCloneBuffer(
let scbuf = JSAutoStructuredCloneBufferWrapper::new(
StructuredCloneScope::DifferentProcess,
&STRUCTURED_CLONE_CALLBACKS,
);
let scdata = &mut ((*scbuf).data_);
let scdata = &mut ((*scbuf.as_raw_ptr()).data_);
WriteBytesToJSStructuredCloneData(
data.serialized.as_mut_ptr() as *const u8,
@ -710,8 +709,6 @@ pub(crate) fn read(
return Err(error);
}
DeleteJSAutoStructuredCloneBuffer(scbuf);
let mut message_ports = vec![];
for reflector in sc_reader.roots.iter() {
let Ok(message_port) = root_from_object::<MessagePort>(reflector.get(), *cx) else {