继续收敛 Direct 上下文路径读取错误
区分外部路径不存在与权限或磁盘元数据读取失败 保留 Direct 上下文边界错误的底层正文
This commit is contained in:
@@ -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(¤t).map_err(|_| "file-not-found")?;
|
||||
let metadata = std::fs::symlink_metadata(¤t).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 的清单版本读取、失效事件重读和事件订阅失败原先只写日志或静默回退;现把安全正文送入启动器状态提示,仍保留已有回退刷新路径。
|
||||
|
||||
Reference in New Issue
Block a user