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:
|
if order < 0 or order > self.max_order:
|
||||||
continue
|
continue
|
||||||
self._coalesce(block, order)
|
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()
|
self._unlock()
|
||||||
|
|
||||||
def reset_all(self):
|
def reset_all(self):
|
||||||
@@ -785,6 +791,10 @@ class MemBuddy(MemManager):
|
|||||||
if self.usable is None:
|
if self.usable is None:
|
||||||
return 0
|
return 0
|
||||||
self._rebuild_free_lists()
|
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
|
return 1
|
||||||
|
|
||||||
# realloc override: buddy system reads original order from block header; old_size is not required
|
# realloc override: buddy system reads original order from block header; old_size is not required
|
||||||
|
|||||||
Reference in new issue
Block a user