Repository navigation
Replies: 1 comment
|
rc5依旧能复现 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
现象
在 DSH 里点过一次「在资源管理器中打开」之后,在那个资源管理器窗口里双击任何 Electron 应用的文件关联都会静默失效:
.md→ Typora 不启动,无报错、无弹窗、任务管理器里无残留重启资源管理器或重启机器后恢复;再从 DSH 点一次「在资源管理器中打开」,立刻复发。DSH 关闭几小时后仍然发作。
根因:explorer.exe 被
ELECTRON_RUN_AS_NODE=1长期污染派生 explorer.exe 的调用链是
path-opener.ts→runNativeCommand()→execFile(),而packages/util/native-command/src/runner.ts不传env,于是 explorer.exe 原样继承宿主进程环境,其中包含桌面端启动 Node 宿主时注入的ELECTRON_RUN_AS_NODE=1(apps/desktop/src/node-environment.ts的desktopNodeEnvironment())。explorer.exe 是常驻进程。它一旦带着这个变量启动,就会永久保留,并传给此后用户从它窗口里双击启动的每一个进程。Typora 拿到
ELECTRON_RUN_AS_NODE=1后不再启动 GUI,而是变成node去把.md当 JavaScript 编译:失败发生在创建窗口之前;Typora 是 GUI 子系统程序(
/SUBSYSTEM:WINDOWS)没有控制台,stderr 无人接收 → 用户看到的就是「双击,什么都没发生」。另外
runExplorer()还会主动吞掉 explorer 的 exit 1(因为「委派给已有 shell 后退出 1」是正常行为),所以 DSH 日志里也没有任何痕迹。实测证据
同一时刻两个 explorer 实例,一个干净一个带毒(环境块是直接读 PEB 拿的,不是看
$env:):ELECTRON_RUN_AS_NODE=1HKCU\Environment与HKLM\...\Session Manager\Environment均不含该键 —— 不是系统环境变量,也不是任何配置文件;它只存在于 DSH 的进程子树里。最小复现
在 DSH 的 shell 里(此时
$env:ELECTRON_RUN_AS_NODE天然为1):新出现的那个 explorer.exe 实例就带着
ELECTRON_RUN_AS_NODE=1,此后它的全部子进程都带毒。与 #8174 等 28 条同根因报告的区别
#8174定位的是packages/subprocess/subprocess/src/index.ts的scrubbedParentEnv()不清洗该键。但本条指向的是另一条泄漏路径:runNativeCommand从不调用scrubbedParentEnv()。所以即使#8174提议的 tombstone 在 subprocess seam 落地,explorer.exe 这条路径依然会泄漏。而已有的 28 条报告,症状都是一次性的、限于 DSH 内部的、用户可归因的(
Open In → VS Code失败、返回 502、静默无窗口)。本条则是:建议修改
A. 直接修本条(可独立合入)
packages/util/native-command/src/runner.ts:给execFile传一个过滤掉ELECTRON_RUN_AS_NODE的 env。安全依据:
runNativeCommand的全部调用点是explorer.exe/reg.exe/wslpath/defaults/open/xdg-open/xcode-select,没有任何一个需要以 Node 模式运行;而#8174评论里担心的 runner 耦合走的是subprocess-local/sandbox-local自己的 spawn 路径,不经过这里,所以在这里 tombstone 不会破坏它。回归测试:仿照
packages/ptc-runtime/ptc-runtime-node/tests/host-failures.spec.ts的既有先例(那里已经断言过子进程环境里没有该变量),在packages/util/native-command/tests/里注入process.env.ELECTRON_RUN_AS_NODE = '1',断言execFile收到的env不含该键、且PATH等变量仍在。B. 根因修复(配合 #8174)
scrubbedParentEnv()加 tombstone,并必须同时在两个显式层补回ELECTRON_RUN_AS_NODE: '1':packages/subprocess/subprocess-local/src/spawn-runner.ts的runnerEnvironment()packages/sandbox/sandbox-windows-acl/src/runner.ts(或其调用方的 env 构造处)因为这两处的 runner 都是以
[process.execPath, runner.js]启动、依赖继承才拿到 Node 模式;只加 tombstone 而不补显式层,会让它们静默失去 Node 模式而坏掉 —— 这正是#8174评论里 argszero 指出的耦合。NODE_OPTIONS属同一类进程级选择器,可一并考虑(目前RUNNER_CONTROL_ENV_PREFIXES = ['NODE_', 'TSX_']只对 runner 生效,普通子进程仍会继承)。C. 用户侧临时自救
注意:在 DSH 的 shell 里
$env:ELECTRON_RUN_AS_NODE = ''或= 0无效 —— Electron 判断的是这个变量的存在性,必须删除(Remove-Item Env:ELECTRON_RUN_AS_NODE)。环境
Windows 11 专业版 build 26200 · DSH 0.2.1-rc.3(Electron 44.7.0)· Typora 1.8.10(内置 Node v18.16.1)
All reactions