fix(phase2): _run_cmd_wait 清零 STARTUPINFOA 等结构体

TPV 的 T() 构造仅 alloca 不 memset(无 __init__ 时只 InitStructDefaults,
extern 结构体无默认值记录 → no-op)。_run_cmd_wait 的 si 只设 cb,
dwFlags 等 15 个字段为栈垃圾:多线程并发调用时垃圾值随机,dwFlags
垃圾位令 CreateProcessA 使用垃圾句柄作子进程 stdio → 子进程行为不定
/父进程线程崩溃(ClassArrayTest e5fb worker 崩、edd8 正常的概率崩溃
根因,70c8810 引入 _run_cmd_wait 时即存在)。si/sa/pi 全部显式清零。
This commit is contained in:
TermiNexus committed 2026-08-19 21:50:56 +08:00
1 parent 4bd254a27f
commit 3f3e3d5898
1 file changed
+7
+7
View File
@@ -527,6 +527,13 @@ def _run_cmd_wait(cmd: str) -> int:
sa: w32.win32base.SECURITY_ATTRIBUTES = w32.win32base.SECURITY_ATTRIBUTES()
si: win32process.STARTUPINFOA = win32process.STARTUPINFOA()
pi: win32process.PROCESS_INFORMATION = win32process.PROCESS_INFORMATION()
# T() 构造仅 alloca 不 memset:STARTUPINFOA 未设字段(dwFlags 等)全为
# 栈垃圾,多线程并发调用时垃圾随机 → dwFlags 垃圾位让 CreateProcessA
# 用垃圾句柄作子进程 stdio → 子进程行为不定/父进程线程崩溃(ClassArrayTest
# e5fb worker 崩溃、edd8 正常的原因)。si/sa/pi 全部显式清零。
string.memset(t.CPtr(c.Addr(si)), 0, win32process.STARTUPINFOA.__sizeof__())
string.memset(t.CPtr(c.Addr(sa)), 0, w32.win32base.SECURITY_ATTRIBUTES.__sizeof__())
string.memset(t.CPtr(c.Addr(pi)), 0, win32process.PROCESS_INFORMATION.__sizeof__())
sa.nLength = w32.win32base.SECURITY_ATTRIBUTES.__sizeof__()
sa.lpSecurityDescriptor = t.CPtr(0)
sa.bInheritHandle = 1