zlib 1.3.2 版本有哪些主要更新?

更新时间

zlib 1.3.2 是 zlib 官网公布的当前版本,发布日期为 2026 年 2 月 17 日。相比 1.3.1,这次更新以安全加固和构建体系整理为主:修复了 7ASecurity 审计发现的问题,为多个函数补上长度与边界检查,新增若干面向大数值和便捷调用的接口,并完全重写了 CMake 支持。如果你在用 1.3.1 或更早版本,且项目涉及解压不可信数据、使用 minizip 或依赖 CMake 构建,升级到 1.3.2 有明确收益;若只是使用稳定的压缩/解压主路径,也可以按常规节奏跟进。

安全与健壮性修复

1.3.2 的更新重点之一是落实 7ASecurity 对 zlib 的审计结论,具体包括:

  • 在 crc32_combine 系列函数中检查负长度,避免传入非法长度时产生未定义行为。
  • inflateCopy 只复制已初始化的窗口内容,deflateCopy 只复制已初始化的 deflate 状态,减少复制未初始化内存带来的风险。
  • 分配时对 inflate 状态清零。
  • 阻止在未显式请求的情况下使用不安全函数。
  • 修复 inflatePrime() 在 16 位 int 平台上的 bug。
  • 修复 gzread() 在出错时返回可用未压缩数据的问题,并让 gz* 系列例程支持非阻塞设备。

这些改动大多不改变正常调用下的行为,但对处理畸形输入、跨平台移植和长时间运行的服务更有保障。

新增函数

新增函数 用途
compressBound_z、deflateBound_z 面向大数值的长度上界计算,避免传统接口在超大输入下的溢出问题
compress_z、uncompress_z 对应的大数值版本压缩/解压便捷接口
deflateUsed() 获取最后一个字节中已使用的位数
zipAlreadyThere()(minizip) 帮助避免向 zip 包中写入重复条目

另外,gzread() 增加了 "G" 选项,用于强制按 gzip 处理、关闭透明读取行为;CRC-32 计算在 s390x 上做了向量化。

构建与工程结构变化

  • CMake 支持被完全重写,这是本次更新中影响构建集成最大的部分。原先依赖旧 CMake 脚本的项目需要重新验证配置结果。
  • 移除了 contrib 中的 untgz。
  • 移除了 vstudio 工程文件,改用 CMake 生成的工程。
  • ./configure 新增 --undefined 选项,供 UBSan 检查器使用。
  • inflate 固定表改为使用原子操作只构建一次。

是否值得升级

  • 建议升级:解压来自外部的不可信数据、使用 minizip 处理 zip 文件、在 16 位 int 或 s390x 等平台上运行、通过 CMake 集成 zlib 的项目。
  • 可按节奏升级:仅使用 compress/uncompress 等稳定接口、输入完全可信的嵌入式场景。升级时重点回归 CMake 构建产物和 minizip 相关调用。

zlib 本身是免费、通用、无专利限制的无损压缩库,数据格式跨平台可移植。版本变更的完整记录可在官网的 Change Log 中核对。