Replies: 2 comments 2 replies
|
我也遇到了此问题 |
2 replies
|
我在当前 我已在本地准备了一个最小补丁,将终止条件改为同时检查两个 NUL 字节: while (end + 1 < bytes.length && (bytes[end] !== 0 || bytes[end + 1] !== 0)) end += 2同时在现有 mocked COM world 测试中加入了 本地验证结果:
改动仅涉及一行实现和一个回归测试。考虑到当前贡献指南暂不接受外部 PR,我没有推送分支。如果维护者愿意接收,我可以提供可直接应用的 git patch/commit;后续开放 PR 时也可以立即整理成 PR。 |
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.
Bug 反馈:Windows 原生目录选择器在低字节为 0x00 的字符(如 一 U+4E00)处截断所选路径,导致
workspace create failed: workspace-invalid-path/ ENOENT问题概述
在 Windows 上,原生文件夹选择器(
dsh-host-directory-picker-native)会把选中的路径静默截断在第一个 UTF-16 码点低字节为0x00的字符处(即所有U+XX00字符,例如 一U+4E00、刀U+5200、退U+9000)。截断后的路径被提交给workspace.create,随后报错:只要所选文件夹的路径中包含这类字符,工作区创建流程就完全不可用——尽管文件夹真实存在,且 DSH 其他环节对 Unicode 路径的支持都是完好的。
运行环境
0.1.0-rc.6(全局 npm 安装@deepseek-ai/dsh@0.1.0-rc.6)@deepseek-ai/dsh-host-directory-picker-native@0.1.0-rc.6directory-picker-auto解析为native)复现步骤
Windows 上启动
dshWeb GUI(原生目录选择器后端生效)。通过选择器添加工作区,导航到路径中含低字节为
0x00字符的文件夹。示例如下(虚构路径,用于演示):第二个路径段是
模块一——字符 一(U+4E00,UTF-16LE 字节为00 4E)位于该段末尾。确认选择。
预期行为
工作区在完整路径下创建成功:
实际行为
对话框返回了完整路径,但该路径在 一 字处被截断,GUI 报错:
注意
D:\演示\模块—— 正是真实路径在 一 字处被截掉后的前缀。根本原因
lib/worker.cjs(由src/win32-dialog-bindings.ts构建而来)中的readUtf16:该循环在偶数偏移处查找第一个
0x00字节,并将其当作字符串 NUL 终止符。这只对 ASCII 有效(ASCII 的高字节恒为0x00)。对于码点为U+XX00的非 ASCII 字符,其 UTF-16LE 编码为00 XX——低字节0x00恰好落在偶数偏移上,被误判为字符串结束。以 一(
U+4E00,字节00 4E)为例:→ 返回的字符串是
D:\演示\模块。最小复现脚本:
建议修复
改为在偶数偏移处查找 NUL 字(
0x0000),而不是单独的0x00字节:已在本地验证:应用该修复后,同一缓冲区可完整还原出
D:\演示\模块一\项目。影响范围
U+XX00字符(如 一U+4E00、刀U+5200、退U+9000等)的文件夹/文件路径,都会在 Windows 原生选择器中触发此问题。这些是常见汉字,因此中文用户受影响面较广。workspace-invalid-path/ ENOENT 报错。browse、macOSosascript、Linux zenity/kdialog)不受影响——它们原样传递路径字符串。end += 2/bytes[end] !== 0),仅dsh-host-directory-picker-native一处存在;路径管道的其余环节(worker IPC → 客户端 →workspace.create→realpath)均为 Unicode 安全,并已端到端验证。临时规避方案(在官方修复前)
U+XX00字符的文件夹;或readUtf16(对话框 worker 每次选择都会重新拉起子进程,因此立即生效;注意包重装会覆盖该补丁)。All reactions