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:
1 parent
4bd254a27f
commit
3f3e3d5898
1 file changed
+7
@@ -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
|
||||
|
||||
Reference in new issue
Block a user