继续收敛 Direct 上下文路径读取错误

区分外部路径不存在与权限或磁盘元数据读取失败

保留 Direct 上下文边界错误的底层正文
This commit is contained in:
kdletters
2026-10-06 00:33:07 +08:00
parent d1d54ebcb1
commit 4d20be776a
2 changed files with 10 additions and 3 deletions
@@ -194,7 +194,7 @@ pub(super) fn external_read_is_protected(display: &str) -> bool {
}
/// O_NOFOLLOW 只保护末段;项目外路径还必须逐段拒绝目录链接与 Windows 重解析点。
pub(super) fn reject_external_read_links(path: &Path) -> Result<(), &'static str> {
pub(super) fn reject_external_read_links(path: &Path) -> Result<(), String> {
let mut current = PathBuf::new();
for component in path.components() {
current.push(component.as_os_str());
@@ -202,9 +202,15 @@ pub(super) fn reject_external_read_links(path: &Path) -> Result<(), &'static str
if matches!(component, std::path::Component::Prefix(_)) {
continue;
}
let metadata = std::fs::symlink_metadata(&current).map_err(|_| "file-not-found")?;
let metadata = std::fs::symlink_metadata(&current).map_err(|error| {
if error.kind() == std::io::ErrorKind::NotFound {
"file-not-found".to_string()
} else {
format!("读取路径元数据失败:{error}")
}
})?;
if metadata.file_type().is_symlink() || windows_metadata_is_reparse_point(&metadata) {
return Err("linked-path");
return Err("linked-path".to_string());
}
}
Ok(())
@@ -82,5 +82,6 @@ DirectProject 回合失败在确认不是客户端内部不可归类故障时,
- 专业 Agent 历史回读与项目清单同步的后台 Promise 失败原先只返回 `failed` 或静默结束;现把具体读取/同步正文写入项目聊天错误出口。
- Direct 交付计划/合同 JSON 解析、策划工作区目录枚举与文本搜索还有 `map_err(|_|)` / `Err(_)` 丢细节;现保留 serde、目录和文件读取正文,安全路径边界仍单独拒绝。
- 直连 Codex 输出指纹此前把除 `NotFound` 之外的所有读取错误都当成“文件不存在”,可能误判产物未变化;现只对确实不存在的文件保留空位,其余磁盘/权限错误沿回合失败正文上送。
- DirectProject 上下文的外部路径元数据读取失败原先统一成 `file-not-found`;现区分确实不存在与权限/磁盘读取错误,后者保留底层正文。
- 错误报告对话框读取最新错误事件或诊断日志失败时原先只显示“暂不可用/使用快照”;现把读取 IPC/文件正文附在状态提示中,快照回退行为保持不变。
- WorkspaceLauncher 的清单版本读取、失效事件重读和事件订阅失败原先只写日志或静默回退;现把安全正文送入启动器状态提示,仍保留已有回退刷新路径。