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:
1 parent
74ed6f2dbc
commit
0f6ebb9065
1 file changed
+10
@@ -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
|
||||
|
||||
Reference in new issue
Block a user