Skip to content

fix(pdfium): allow zero-length WriteBlock() no-op#257

Merged
deepin-bot[bot] merged 2 commits intolinuxdeepin:release/eaglefrom
LiHua000:release/eagle
Mar 19, 2026
Merged

fix(pdfium): allow zero-length WriteBlock() no-op#257
deepin-bot[bot] merged 2 commits intolinuxdeepin:release/eaglefrom
LiHua000:release/eagle

Conversation

@LiHua000
Copy link
Contributor

Treat WriteBlock(size==0) as success and only require non-null data when size>0. This prevents aborts when serializing empty names/streams and aligns implementations/call sites with the interface contract.

log: fix bug

upstream:chromium/pdfium@0e723c5#diff-89818b20cf16ed5dfbf8b50d13c34fc3596cacf04bd3c4da3c2d433a6bbe6526 Bug: https://pms.uniontech.com/bug-view-353429.html

Treat WriteBlock(size==0) as success and only require non-null data when
size>0. This prevents aborts when serializing empty names/streams and aligns
implementations/call sites with the interface contract.

log: fix bug

upstream:chromium/pdfium@0e723c5#diff-89818b20cf16ed5dfbf8b50d13c34fc3596cacf04bd3c4da3c2d433a6bbe6526
Bug: https://pms.uniontech.com/bug-view-353429.html
Log: as title
@LiHua000 LiHua000 closed this Mar 19, 2026
@LiHua000 LiHua000 reopened this Mar 19, 2026
@deepin-ci-robot
Copy link

deepin pr auto review

这段代码 diff 主要涉及 PDF 处理库(pdfium)中流写入逻辑的改进,以及许可证文件的更新。以下是对修改内容的详细审查,包括语法逻辑、代码质量、性能和安全方面的分析。

总体评价

这次修改主要针对 空指针/零长度写入 的边界情况处理进行了统一和规范化。核心逻辑是将“写入0字节数据”定义为合法的空操作,并允许此时传入 nullptr,同时移除了对 size > 0 的断言。这种修改增强了代码的鲁棒性,防止了潜在的空指针解引用崩溃。

详细审查

1. 文件:.reuse/dep5

  • 修改内容:添加了 .project 文件的版权声明(CC0-1.0)。
  • 审查意见
    • 合规性:符合开源许可证管理规范。
    • 逻辑:无逻辑问题,属于配置更新。

2. 文件:3rdparty/.../cpdf_creator.cpp (CFX_FileBufferArchive::WriteBlock)

  • 修改内容
    // 新增逻辑
    if (size == 0)
      return true;
    
    ASSERT(pBuf);
    // 原代码: ASSERT(size > 0); // 被移除
    if (!pBuf)
      return false;
  • 语法逻辑正确。逻辑上先检查 size == 0,如果是则直接返回成功,避免了对 pBuf 的非空检查(因为允许 0 长度时为空)。
  • 代码质量优秀
    • 注释清晰地解释了为什么允许 size==0pBuf==nullptr(例如:空字符串序列化)。
    • 将运行时检查 if (!pBuf) 替代了单纯的 ASSERT(pBuf),防止了 Release 版本下的潜在崩溃。
  • 代码性能无影响。增加了一个 if 分支,但这是处理边界条件所必需的,且开销极小。
  • 代码安全提升。防止了当 size==0pBuf==nullptr 时可能发生的误判或崩溃。

3. 文件:3rdparty/.../cpdf_stream.cpp (CPDF_Stream::WriteTo)

  • 修改内容
    // 原代码: if (size && !archive->WriteBlock(data.data(), size))
    // 修改为:
    if (!archive->WriteBlock(data.data(), size))
  • 语法逻辑正确
    • 原代码逻辑:如果 size > 0,则调用 WriteBlock;如果 size == 0,跳过写入。
    • 新代码逻辑:无论 size 为何值,都调用 WriteBlock
    • 一致性:这个修改依赖于 cpdf_creator.cpp 中的修改,即 WriteBlock 内部已经处理了 size == 0 的情况。这使得调用方不需要再显式检查 size,逻辑更统一。
  • 代码质量提升。简化了调用方的逻辑,将边界检查下沉到底层实现,符合 DRY(Don't Repeat Yourself)原则。
  • 代码安全提升。统一的行为减少了不同调用者处理边界情况不一致带来的风险。

4. 文件:3rdparty/.../cfx_memorystream.cpp (CFX_MemoryStream::WriteBlockAtOffset)

  • 修改内容
    // 原代码: if (!buffer || offset < 0 || !size)
    // 修改为:
    if (offset < 0)
      return false;
    
    if (size == 0)
      return true;
    
    DCHECK(buffer);
    if (!buffer)
      return false;
  • 语法逻辑正确。与 CFX_FileBufferArchive::WriteBlock 的修改保持一致。
  • 代码质量良好
    • offset < 0 的检查提前,逻辑分层更清晰。
    • 使用 DCHECK (Debug Check) 替代 ASSERT,并在 Release 版本保留运行时检查 if (!buffer),兼顾了调试时的断言和发布时的安全性。
  • 代码安全提升。明确区分了参数校验和空指针保护。

5. 文件:3rdparty/.../fx_stream.h (IFX_WriteStream)

  • 修改内容:在接口 WriteBlock 前添加了注释。
  • 审查意见
    • 文档优秀。明确规定了接口契约:“当 size 为 0 时,视为空操作并返回 true,这也是唯一允许 pData 为空的情况”。
    • 这为所有实现该接口的类提供了明确的行为指南。

改进建议

虽然代码质量已经很高,但仍有微小的优化空间:

  1. 关于 DCHECK vs ASSERT

    • cfx_memorystream.cpp 中使用了 DCHECK,而在 cpdf_creator.cpp 中使用了 ASSERT。建议在整个项目中统一断言宏的使用,或者在风格指南中明确区分两者的使用场景(例如:DCHECK 仅用于 Debug 内部逻辑检查,ASSERT 用于必须满足的契约)。目前看,意图应该是“在 Debug 模式下断言,Release 模式下安全返回”,目前的写法是安全的。
  2. 关于 size_t 类型的比较

    • WriteBlockAtOffset 中检查 offset < 0FX_FILESIZE 通常是 longint32_t 类型,如果它是有符号整数,这个检查是有效的。如果 FX_FILESIZE 被定义为无符号类型(如 size_t),这个检查永远为假。建议确认 FX_FILESIZE 的定义。根据 PDFium 的常见定义,它通常是有符号的,所以当前代码是安全的。
  3. 注释一致性

    • fx_stream.h 中的注释非常规范。建议在 CFX_FileBufferArchive::WriteBlockCFX_MemoryStream::WriteBlockAtOffset 的实现处也引用或简要提及该接口契约,或者保持现状,因为头文件注释已经足够清晰。

总结

这是一次高质量的代码提交。它成功地修复了潜在的边界条件处理不一致问题,提高了代码的健壮性和安全性。通过在接口层定义契约(size 为 0 时允许空指针)并在实现层统一执行,消除了调用方的负担和潜在的错误。代码逻辑清晰,注释详尽。

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: LiHua000, max-lvs

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@LiHua000
Copy link
Contributor Author

/merge

@deepin-bot deepin-bot bot merged commit b99c6c0 into linuxdeepin:release/eagle Mar 19, 2026
18 of 19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants