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

4.3 KiB
Raw Blame History

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。