fix(zlib): 修正 out/buf 形参的联合类型写法,消除跨模块 ABI 错位

t.CUInt8T | t.CPtr[t.CPtr] 在定义侧按 PtrCount 累加得 i8**,但 stub/declare 侧(VpiReader 只把整段等于 t.CPtr/CPtr 的段认作 CPtr 标记)会坍缩为首段 i8,导致跨模块调用只传 1 字节、被调用方按 8 字节指针写入。ZlibTest 的 test_decompressobj 即由此触发 ASan heap-buffer-overflow:写入地址 = 压缩缓冲起址 -16(第 5 参栈槽残留的 compressed 指针被清零低字节)

改用 指针别名 | t.CPtr(两侧同为 i8**,与 win32sync.vp:65、posix.vp:199 同形),覆盖 zinflate_stream.decompress、zdeflate_stream.compress/flush、pyzlib.append_bytes 共 4 处;不改任何运行期逻辑
This commit is contained in:
TermiNexus committed 2026-09-15 23:58:39 +08:00
1 parent a9a53bd117
commit 794488b0f6
3 files changed
+19 -4

No files matched your search

+9 -1
View File
@@ -376,8 +376,16 @@ class zinflate_stream:
self.input_pos += 4
return 0
# out 是"指针的指针"(i8**)。不要写成 `t.CUInt8T | t.CPtr[t.CPtr]`:
# 联合里嵌 `t.CPtr[...]` 下标时,定义侧按 PtrCount 累加得 i8**,而 stub/declare
# 侧(StubGen/VpiReader)只把整段等于 `t.CPtr`/`CPtr` 的段认作 CPtr 标记,
# 于是坍缩成首段 `t.CUInt8T` = i8 → 跨模块 ABI 不一致(调用方只传 1 字节,
# 被调用方按 8 字节指针写入 → ASan heap-buffer-overflow)。
# 改用"指针别名 | t.CPtr":两侧都按"追加 1 层指针"解析,同为 i8**。
# 同形先例:includes/w32/win32sync.vp:65 `Context: VOIDPTR | t.CPtr`、
# includes/posix.vp:199 `argv: CHARPTR | t.CPtr`。
def decompress(self, data: UINT8PTR, length: t.CSizeT,
max_length: t.CSizeT, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt:
max_length: t.CSizeT, out: BYTEPTR | t.CPtr, out_len: t.CSizeT | t.CPtr) -> t.CInt:
if not self.is_initialized: return -2
self.input_data = data
self.input_len = length