mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
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:
parent
633d746e2f
commit
ab6e151c89
2 changed files with 11 additions and 14 deletions
6
Cargo.lock
generated
6
Cargo.lock
generated
|
@ -5228,7 +5228,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mozjs"
|
name = "mozjs"
|
||||||
version = "0.14.1"
|
version = "0.14.1"
|
||||||
source = "git+https://github.com/servo/mozjs#128e1e230a0155ed9395c718184f34bddc045860"
|
source = "git+https://github.com/servo/mozjs#9c017973a4bf9186df2335d8c96ed3554b84434e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen 0.71.1",
|
"bindgen 0.71.1",
|
||||||
"cc",
|
"cc",
|
||||||
|
@ -5239,8 +5239,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mozjs_sys"
|
name = "mozjs_sys"
|
||||||
version = "0.128.13-0"
|
version = "0.128.13-1"
|
||||||
source = "git+https://github.com/servo/mozjs#128e1e230a0155ed9395c718184f34bddc045860"
|
source = "git+https://github.com/servo/mozjs#9c017973a4bf9186df2335d8c96ed3554b84434e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen 0.71.1",
|
"bindgen 0.71.1",
|
||||||
"cc",
|
"cc",
|
||||||
|
|
|
@ -20,8 +20,7 @@ use constellation_traits::{
|
||||||
};
|
};
|
||||||
use js::gc::RootedVec;
|
use js::gc::RootedVec;
|
||||||
use js::glue::{
|
use js::glue::{
|
||||||
CopyJSStructuredCloneData, DeleteJSAutoStructuredCloneBuffer, GetLengthOfJSStructuredCloneData,
|
CopyJSStructuredCloneData, GetLengthOfJSStructuredCloneData, WriteBytesToJSStructuredCloneData,
|
||||||
NewJSAutoStructuredCloneBuffer, WriteBytesToJSStructuredCloneData,
|
|
||||||
};
|
};
|
||||||
use js::jsapi::{
|
use js::jsapi::{
|
||||||
CloneDataPolicy, HandleObject as RawHandleObject, Heap, JS_IsExceptionPending,
|
CloneDataPolicy, HandleObject as RawHandleObject, Heap, JS_IsExceptionPending,
|
||||||
|
@ -31,7 +30,9 @@ use js::jsapi::{
|
||||||
};
|
};
|
||||||
use js::jsval::UndefinedValue;
|
use js::jsval::UndefinedValue;
|
||||||
use js::rust::wrappers::{JS_ReadStructuredClone, JS_WriteStructuredClone};
|
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 script_bindings::conversions::{IDLInterface, SafeToJSValConvertible};
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
@ -599,11 +600,11 @@ pub(crate) fn write(
|
||||||
let mut sc_writer = StructuredDataWriter::default();
|
let mut sc_writer = StructuredDataWriter::default();
|
||||||
let sc_writer_ptr = &mut sc_writer as *mut _;
|
let sc_writer_ptr = &mut sc_writer as *mut _;
|
||||||
|
|
||||||
let scbuf = NewJSAutoStructuredCloneBuffer(
|
let scbuf = JSAutoStructuredCloneBufferWrapper::new(
|
||||||
StructuredCloneScope::DifferentProcess,
|
StructuredCloneScope::DifferentProcess,
|
||||||
&STRUCTURED_CLONE_CALLBACKS,
|
&STRUCTURED_CLONE_CALLBACKS,
|
||||||
);
|
);
|
||||||
let scdata = &mut ((*scbuf).data_);
|
let scdata = &mut ((*scbuf.as_raw_ptr()).data_);
|
||||||
let policy = CloneDataPolicy {
|
let policy = CloneDataPolicy {
|
||||||
allowIntraClusterClonableSharedObjects_: false,
|
allowIntraClusterClonableSharedObjects_: false,
|
||||||
allowSharedMemoryObjects_: false,
|
allowSharedMemoryObjects_: false,
|
||||||
|
@ -633,8 +634,6 @@ pub(crate) fn write(
|
||||||
CopyJSStructuredCloneData(scdata, data.as_mut_ptr());
|
CopyJSStructuredCloneData(scdata, data.as_mut_ptr());
|
||||||
data.set_len(nbytes);
|
data.set_len(nbytes);
|
||||||
|
|
||||||
DeleteJSAutoStructuredCloneBuffer(scbuf);
|
|
||||||
|
|
||||||
let data = StructuredSerializedData {
|
let data = StructuredSerializedData {
|
||||||
serialized: data,
|
serialized: data,
|
||||||
ports: sc_writer.ports.take(),
|
ports: sc_writer.ports.take(),
|
||||||
|
@ -675,11 +674,11 @@ pub(crate) fn read(
|
||||||
};
|
};
|
||||||
let sc_reader_ptr = &mut sc_reader as *mut _;
|
let sc_reader_ptr = &mut sc_reader as *mut _;
|
||||||
unsafe {
|
unsafe {
|
||||||
let scbuf = NewJSAutoStructuredCloneBuffer(
|
let scbuf = JSAutoStructuredCloneBufferWrapper::new(
|
||||||
StructuredCloneScope::DifferentProcess,
|
StructuredCloneScope::DifferentProcess,
|
||||||
&STRUCTURED_CLONE_CALLBACKS,
|
&STRUCTURED_CLONE_CALLBACKS,
|
||||||
);
|
);
|
||||||
let scdata = &mut ((*scbuf).data_);
|
let scdata = &mut ((*scbuf.as_raw_ptr()).data_);
|
||||||
|
|
||||||
WriteBytesToJSStructuredCloneData(
|
WriteBytesToJSStructuredCloneData(
|
||||||
data.serialized.as_mut_ptr() as *const u8,
|
data.serialized.as_mut_ptr() as *const u8,
|
||||||
|
@ -710,8 +709,6 @@ pub(crate) fn read(
|
||||||
return Err(error);
|
return Err(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteJSAutoStructuredCloneBuffer(scbuf);
|
|
||||||
|
|
||||||
let mut message_ports = vec![];
|
let mut message_ports = vec![];
|
||||||
for reflector in sc_reader.roots.iter() {
|
for reflector in sc_reader.roots.iter() {
|
||||||
let Ok(message_port) = root_from_object::<MessagePort>(reflector.get(), *cx) else {
|
let Ok(message_port) = root_from_object::<MessagePort>(reflector.get(), *cx) else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue