fix(memhub): detection 记录表随 reset_to/reset 截断

reset_to/reset 只把块归还 free list、从不清理 _det_records,导致 reset 后旧记录仍标 active:下一轮 alloc 复用同一块被误报为分配重叠/越界写(SlotsBugTest 7B buf + 72B Token 误报根因),探测器在 Phase1 扫描就 exit(1),永远走不到 Phase2 的真实 UAF 检查。

修复:reset_to(mark) 同步截断 _det_count=mark(与 chk_depth 等长,每次 alloc 各追加一条、free 只置标志不删),reset() 置 _det_count=0。
This commit is contained in:
TermiNexus committed 2026-08-25 16:05:21 +08:00
1 parent 74ed6f2dbc
commit 0f6ebb9065
1 file changed
+10
+10
View File
@@ -478,6 +478,12 @@ class MemBuddy(MemManager):
if order < 0 or order > self.max_order:
continue
self._coalesce(block, order)
# [DET] reset-aware:记录表与 chk 栈等长(每次 alloc 各追加一条,
# free 只置标志不删),截断 chk_depth 必须同步截断 _det_count,
# 否则 reset 后旧记录仍标 active → 下一轮 alloc 复用同一块被
# 误报为"分配重叠/越界写"(SlotsBugTest 7B buf + 72B Token 误报根因)。
if self.detection != 0 and self._det_records is not None:
self._det_count = mark
self._unlock()
def reset_all(self):
@@ -785,6 +791,10 @@ class MemBuddy(MemManager):
if self.usable is None:
return 0
self._rebuild_free_lists()
# [DET] reset 重建全部 free list = 全部块释放:记录表同步清空,
# 防止后续 alloc 复用旧块被误报(与 reset_to 截断同因)。
if self.detection != 0 and self._det_records is not None:
self._det_count = 0
return 1
# realloc override: buddy system reads original order from block header; old_size is not required