From 0f6ebb9065c3d63aca8779c15b6dd5acebf28fa1 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 25 Aug 2026 16:05:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(memhub):=20detection=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=A1=A8=E9=9A=8F=20reset=5Fto/reset=20=E6=88=AA=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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。 --- includes/memhub.vp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/includes/memhub.vp b/includes/memhub.vp index 1745e31..cdd28b4 100644 --- a/includes/memhub.vp +++ b/includes/memhub.vp @@ -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