Files
ElyOffice/tasks/reviews/C17.1-r1.md
T

14 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
FAIL
crates/ely-lok/src/worker.rs:306 — 文档会话编号直接取原生指针,释放后的地址会被下一份文档复用,破坏 §17.2 的会话隔离,并使新文档的事件流失效。实测通过公开 API 连续载入、关闭同一 FODT,保留旧 Doc 的 clone:第 4 次载入复用了第 2 次的编号,旧 Doc.size 返回新文档的尺寸;对新文档键入后,poll_events 仍返回 seq=0、空正文和空状态。原因是 worker 用 doc.id() 重新登记文档,而 Feed.closed 保留该编号并持续丢弃其事件。修复方向:为每次载入分配唯一会话编号,分离协议会话与原生指针,并让文档请求、回调与事件订阅共同使用该会话;加入关闭再打开及旧句柄访问的回归测试。证据:/tmp/ely-c171-probes.log。
crates/ely-pdf-engine/src/bin/ely-pdf-worker/main.rs:157 — 编辑请求只读文档编号和操作参数,缺少 §17.2 要求的预期修订,worker 会执行基于旧页面布局的请求。实测打开 A、B、C 三页,history=0 时记录 B 的页码 1;删除 A 后 history=1,提交此前准备的 rotate_pages(doc, &[1], 90),返回成功标记 "2",实际旋转了 C,C 的尺寸从 300×500 变为 500×300。LOK 请求在 crates/ely-lok/src/client.rs:287 同样只发送请求编号与操作 payload。修复方向:为依赖文档状态的请求携带会话与预期修订,在访问内核和执行副作用前校验,过期请求返回明确错误;加入过期编辑及读取的回归测试。证据:/tmp/ely-c171-probes.log。
crates/ely-pdf-engine/src/client.rs:25 — Doc 仅保存 worker 内递增的 u64,各 worker 都从 1 开始,客户端接受其他 worker 会话的旧句柄。实测 worker A 打开 A.pdf 得到 Doc(1),销毁 A 后 worker B 打开 B.pdf 也得到 Doc(1);调用 B.close(A 的旧 Doc) 返回 Ok(()),随后 B.pages(B 的有效 Doc) 报 "no document 1"。旧会话请求因此可以关闭新会话的文档。修复方向:将 Doc 绑定到唯一 worker 会话,并在客户端发送和 worker 接收时核对会话身份;加入 worker 重启及跨 worker 句柄的回归测试。证据:/tmp/ely-c171-probes.log。
crates/ely-ipc/src/lib.rs:13 — write_frame 允许写出超过 MAX_FRAME 的消息,read_frame 在第 48 行拒绝相同消息,发送端可把正常数据请求变成协议故障。实测写入 MAX_FRAME+1 字节返回 Ok(()),产生 67,108,878 字节,随后读取报 InvalidData("frame over the cap");LOK 粘贴同样大小的 payload 会触发 worker 退出,连带中断其他打开文档。修复方向:写入任何字节前检查双方共同的大小上限,对超限请求或结果显式报错,并补充边界与管道保持可用的测试。临时副本增加发送前检查后,同一断言通过且输出长度为 0;原实现断言失败。证据:/tmp/ely-c171-cap.log。
crates/ely-lok/src/client.rs:291 — 输出读取失败被 frames::read_frames 转成 None,request 随即无期限等待 child.wait;仍存活的 worker 使调用永远无法返回错误,原始协议错误也仅留在日志中。实测假 worker 正确完成版本与图块握手,收到 SET_AUTHOR 后发出超限帧头并保持存活:调用 4 秒后仍阻塞,sample 栈显示 Worker::set_author → Worker::request → __wait4。修复方向:通过回复通道传递实际读取错误,协议或输出通道故障时终止并回收 worker,再向调用方返回该错误;加入损坏输出且子进程存活的失败路径测试。证据:/tmp/ely-c171-bad-frame.log。
crates/ely-pdf-engine/src/bin/ely-pdf-worker/main.rs:333 — 原生文档打开成功后,locked、unlock 或 journal 失败直接经 ? 返回,Open 没有释放逻辑,尚未登记的文档也无法经 CLOSE 回收,违反 §17.2 的 FFI 资源释放要求。实测同一 worker 连续打开一个 787,252 字节的有效 PNG:MuPDF 打开图像后 journal 每次报 "not a PDF",120 次失败使 RSS 从 5,392 KiB 增至 103,920 KiB,之后有效 PDF 仍可打开。临时副本在 journal 错误路径调用 close 后,同样 120 次失败的 RSS 增量降至 1,488 KiB。修复方向:让打开全过程拥有明确的资源守卫,任一初始化或 repair 失败都释放原生对象、撤销登记并清理临时文件;加入重复打开失败的资源回归测试。证据:/tmp/ely-c171-native-leak.log。