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:
2026-08-15 19:02:39 +08:00
parent e718394072
commit d97d39e8ad
5 changed files with 149 additions and 3 deletions
+2 -2
View File
@@ -66,8 +66,8 @@ impl Vm {
self.promote_value_if_epoch_object(value, forwarding)
});
} else if src_ref.is_generator_obj() {
// 生成器状态盒为堆分配、promote 后与源共享同一盒:就地改写其 JsValue。
crate::generator::rewrite_generator_native(dst_ref, |value| {
// 生成器状态盒深拷贝到新对象:源盒随 epoch 释放,互不共享。
crate::generator::clone_generator_native_with_rewrite(src_ref, dst_ref, |value| {
self.promote_value_if_epoch_object(value, forwarding)
});
} else if src_ref.is_promise_obj() {