gemini-cli 原子写入曾静默覆盖只读文件、切断硬链接,PR 详解修法
elberthc-byte · ghdev · 2026-10-14
google-gemini/gemini-cli 的 #29499 引入原子写入后,StandardFileSystemService.writeTextFile 开始静默覆盖只读文件并切断硬链接:rename(2) 只检查目录权限而不看目标文件的写权限位,0444 文件不再报 EACCES;同时 rename 换了 inode,编辑硬链接的一个名字会让其他名字留在旧内容上。
PR 用两个小守卫恢复原行为:
- 对已存在的目标先做 fs.access(realPath, WOK),由内核判断(覆盖 ACL、immutable 文件、只读挂载),失败时与普通 fs.writeFile 一样报 EACCES;这也是 Vim 只读检测的做法。
- 当目标 stat.nlink > 1 时改为原地写入而非 rename,让所有链接看到同一内容——在该场景下有意用原子性换正确性,与 Vim 的 backupcopy=auto 决策一致。
通过把 getFileMode() 改为 statIfExists(),模式与链接数来自同一次 stat,唯一新增的系统调用是 access。新文件不受影响。
「编程与Agent」频道最新
- 50+ 免费 AI Agent 学习资源合集:视频与仓库一站打包 — ifioknkem · 2026-10-23
- 自封「全网最佳」的免费 AI Agent 资源库引围观 — ifioknkem · 2026-10-23
- Vercel 推出免注册部署:拖拽文件到首页即得线上 URL — steren · 2026-10-23
- 5 个 Claude Code 会话经 MCP 互发邮件,组队攻破多品牌网络摄像头 — doodlestein · 2026-10-23
- Vercel 上线 vercel deploy --temporary,可临时部署后自动清理 — cramforce · 2026-10-23
- 用同一个 Notion 工作区让多个 Agent 互相沟通分工,实测有效 — nbaschez · 2026-10-23