4.6 KiB
FAIL
crates/ely-files/src/recovery.rs:207 — [P1] restore_copy 使用 std::fs::copy,会截断已有目标并跟随目标符号链接,违反 §6.3 的恢复生成新副本要求。实测将包含 recovered 的恢复点复制到已有 source.md,或指向该文件的 restored.md 符号链接,均返回 Ok(()),原内容 original 被覆盖。修复方向:排他创建恢复目标,目标已存在时返回错误或选择新名称,保证路径别名也无法覆盖源文件;补已有文件、符号链接与硬链接回归测试。
crates/ely-files/src/recovery.rs:111 — [P1] 恢复内容直接写入正式 .bin,枚举时缺少完整提交校验,失败写入会成为可恢复内容。子进程设置 RLIMIT_FSIZE=1024 后写入 8192 字节,write_once 返回错误、last_ok 为 None,重建 Recovery 后却列出长度仅 1024 的恢复点。清理也有同类中断问题:在删除 .bin 后留下 .cursor,points() 会返回不存在的内容路径,后续写入在 bytes() 中持续报 NotFound。修复方向:暂存并校验、同步完整恢复点后原子发布,枚举只认可已提交内容,并让中断清理可恢复;补部分写入及清理中断测试。
crates/ely-files/src/recovery.rs:92 — [P1] last_ok 在清理前更新,清理能够删除全部恢复点,随后仍返回成功及已删除路径,违反 §6.2 对最后成功恢复时间和持久化状态的要求。实测容量为 4 字节,先写入 old!,再写入 large:两份内容全部被删除,第二次结果仍为 Ok(Some(path)),last_ok 变成第二次时间,points() 为空;默认容量下单个文档超过 64 MiB 同样触发。修复方向:提交前核算单点容量,超限明确失败并保留最近有效恢复点,最终确认恢复点仍可用后再更新成功状态;补超大单点测试。
crates/ely-files/src/recovery.rs:267 — [P1] 放弃状态只记录在随后会被 Crash::open 覆盖的 session.lock 中,恢复点没有会话归属或持久放弃状态。实测先生成 explicitly discarded 并调用 discard(),再由新子进程打开同一文档目录并在首次恢复写入前遭到 SIGKILL;下次检查返回 Crashed,恢复列表重新包含已放弃内容,违反 §6.2。修复方向:将放弃结果与对应会话或恢复点持久关联,保证下一次会话开启及崩溃后仍排除该内容;补真实进程终止回归测试。
crates/ely-files/src/recovery.rs:75 — [P1] 加密文档恢复被无条件拒绝,§18.2 要求的加密恢复与系统密钥保护路径缺失。Recovery::sensitive(...).write_once(...) 对所有输入直接返回 PermissionDenied,代码和依赖均没有获取恢复密钥、加密写入或解密恢复的入口,因此已解锁的加密文档也会永久失去崩溃恢复能力。现有测试仅验证拒绝写入。修复方向:接入成熟加密库及系统密钥保护,验证加密恢复往返、磁盘内容保密和密钥无法解锁时的明确失败。
crates/ely-files/src/recovery.rs:31 — [P2] 10 秒间隔仅为未被执行路径使用的常量,模块提供的写入入口同步完成全部 I/O,缺少 §6.2 要求的后台定时恢复调度。源码检索确认没有调度调用方;实测在时间 100 秒和 101 秒连续调用会立即产生两个恢复点。running 仅在同一个持有独占 &mut self 的同步调用内设为真再清零,现有并发测试直接篡改私有字段,未验证实际后台任务重叠。修复方向:实现可执行的 10 秒后台调度及同文档任务占用管理,以可控时钟和延迟写入验证周期、跳过重叠任务及失败后继续调度。
crates/ely-files/src/recovery.rs:120 — [P2] 七天清理仅由新恢复点写入触发,重启与读取恢复列表均保留过期副本,违反 §6.2 的最长保留时间。实测写入时间为当前时间减八天的恢复点,随后销毁并重新创建 Recovery;points() 仍返回该内容,磁盘文件仍存在。用户只查看恢复列表或文档之后没有新编辑时,副本会无限期保留。修复方向:在恢复目录打开、扫描或维护流程中按当前时间执行过期清理,并测试重启后没有新写入的情况。
crates/ely-files/src/recovery.rs:182 — [P2] 容量统计只累计 .bin,光标与历史文件完全漏算,实际恢复目录可突破用户设置的上限。实测容量为 4 字节,写入 1 字节内容及 4096 字节光标字符串后返回成功,目录实际占用 4097 字节。修复方向:容量核算覆盖每个恢复点的全部文件,以带元数据的恢复点验证容量清理和超限失败。