fix: 生成器状态盒深拷贝消除 sweep/promote 共享所有权 UAF,full_reset 补释放 session 堆数据
GeneratorState 状态盒此前由 epoch 原对象独占释放,promote 与 sweep 克隆 浅拷贝 native_data 共享同一盒,旧对象 drop 即悬垂。新增 clone 深拷贝 (参照 async_generator),promote/sweep 两处接入,恢复执行读新盒; full_reset 在 session arena 重置前遍历 session 对象释放堆数据, 配合深拷贝形成单所有权。补 sweep/promote/full_reset 三回归与 生成器捕获闭包跨 GC 回归。
This commit is contained in:
@@ -872,6 +872,24 @@ pub(crate) fn rewrite_generator_native(obj: &JsObject, mut rewrite: impl FnMut(J
|
||||
state.suspended.rewrite_values(rewrite);
|
||||
}
|
||||
|
||||
/// 深拷贝状态盒到新对象(promote / sweep 用):新对象持独立 Box,源盒可安全释放。
|
||||
pub(crate) fn clone_generator_native_with_rewrite(
|
||||
old: &JsObject, new: &mut JsObject, mut rewrite: impl FnMut(JsValue) -> JsValue,
|
||||
) {
|
||||
let Some(state) = generator_state_mut(old) else {
|
||||
return;
|
||||
};
|
||||
let cloned = GeneratorState {
|
||||
phase: state.phase,
|
||||
callee: rewrite(state.callee),
|
||||
args: state.args.iter().copied().map(&mut rewrite).collect(),
|
||||
this_value: state.this_value,
|
||||
result: rewrite(state.result),
|
||||
suspended: state.suspended.clone_with_rewrite(rewrite),
|
||||
};
|
||||
new.set_native_data(Box::into_raw(Box::new(cloned)) as *mut u8);
|
||||
}
|
||||
|
||||
/// 释放生成器状态盒(对象被 GC 回收时),返回释放字节数。
|
||||
pub(crate) fn drop_generator_native(obj: &JsObject) -> u64 {
|
||||
if !obj.is_generator_obj() {
|
||||
|
||||
Reference in New Issue
Block a user