mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
fix: 对象断言测试持活 Vm 消除返回值裸指针 UAF
This commit is contained in:
@@ -53,7 +53,8 @@ fn define_property_partial_enumerable_only_preserves_value() {
|
||||
// ── getOwnPropertyDescriptor 返回数据字段(无 get/set)──
|
||||
#[test]
|
||||
fn get_own_property_descriptor_data_fields() {
|
||||
let r = eval_str(
|
||||
// 返回值是数组对象,Vm 需存活到断言结束(对象值为指向会话内存的裸指针)。
|
||||
let (_vm, r) = eval(
|
||||
"var obj={x:1}; var d=Object.getOwnPropertyDescriptor(obj,'x'); [d.value,d.writable,d.enumerable,d.configurable,d.get,d.set]",
|
||||
)
|
||||
.unwrap();
|
||||
@@ -73,7 +74,8 @@ fn get_own_property_descriptor_data_fields() {
|
||||
// ── getOwnPropertyDescriptor 返回访问器字段(无 value/writable)──
|
||||
#[test]
|
||||
fn get_own_property_descriptor_accessor_fields() {
|
||||
let r = eval_str(
|
||||
// 返回值是数组对象,Vm 需存活到断言结束(对象值为指向会话内存的裸指针)。
|
||||
let (_vm, r) = eval(
|
||||
"var obj={}; Object.defineProperty(obj,'x',{get:function(){return 1;},enumerable:true,configurable:true}); var d=Object.getOwnPropertyDescriptor(obj,'x'); [d.get!==undefined,d.set===undefined,d.enumerable,d.configurable,d.value===undefined,d.writable===undefined]",
|
||||
)
|
||||
.unwrap();
|
||||
@@ -106,7 +108,8 @@ fn define_property_new_attributes_only_defaults_value_undefined() {
|
||||
// ── 既有属性的部分 configurable 更新保留既有值 ──
|
||||
#[test]
|
||||
fn define_property_partial_configurable_preserves_value() {
|
||||
let r = eval_str("var obj={}; obj.x=1; Object.defineProperty(obj,'x',{configurable:false}); [obj.x]").unwrap();
|
||||
// 返回值是数组对象,Vm 需存活到断言结束(对象值为指向会话内存的裸指针)。
|
||||
let (_vm, r) = eval("var obj={}; obj.x=1; Object.defineProperty(obj,'x',{configurable:false}); [obj.x]").unwrap();
|
||||
let arr = unsafe { &*r.as_js_object_ptr() };
|
||||
assert!(arr.get_prop_at(0).is_int() && arr.get_prop_at(0).as_int() == 1, "value should be 1");
|
||||
}
|
||||
|
||||
@@ -115,7 +115,8 @@ fn keys_with_leading_zero_not_integer_index() {
|
||||
#[test]
|
||||
fn numeric_literal_key_materializes_as_string() {
|
||||
// `{5:1}` 的键是字符串 "5"(键经 ToPropertyKey 字符串化),读 o[5]/o["5"] 同一键。
|
||||
let r = eval_str("var o={5:1}; Object.getOwnPropertyNames(o)[0]").unwrap();
|
||||
// 字符串值是会话内存裸指针,Vm 需存活到拷贝结束。
|
||||
let (_vm, r) = eval("var o={5:1}; Object.getOwnPropertyNames(o)[0]").unwrap();
|
||||
assert!(r.is_string());
|
||||
let s = unsafe { &*r.as_string_ptr() }.to_owned_string();
|
||||
assert_eq!(s, "5");
|
||||
|
||||
Reference in New Issue
Block a user