libjpeg-turbo 3.0.0 现已正式发布。libjpeg-turbo 是一个 JPEG 图像编解码器,它使用 SIMD 指令(MMX、SSE2、AVX2、Neon、AltiVec)来加速 x86、x86-64、Arm 和 PowerPC 系统上的基线 JPEG 压缩和解压缩,以及 x86、x86-64 和 Arm 系统的渐进式 JPEG 压缩。
相对于 3.0 beta2 的重大变化:
-
TurboJPEG API 现在支持 4:4:1(transposed 4:1:1)色度子采样,允许无损转置或旋转 4:1:1 JPEG 图像进行无损裁剪、部分解压缩或解压缩为平面 YUV 图像。
-
修复了各种 segfaults 和缓冲区溢出 (CVE-2023-2804)在尝试使用颜色量化或合并色度上采样/颜色转换来解压缩各种特制的格式错误的每分量 12 位和每分量 16 位无损 JPEG 图像时发生。这些问题的根本原因是颜色量化和合并色度上采样/颜色转换算法在设计时并未考虑到无损解压缩。由于 libjpeg-turbo 在压缩或解压缩无损 JPEG 图像时明确不支持颜色转换,因此不应为此类图像启用合并色度上采样/颜色转换。颜色量化是一项传统功能,对于无损 JPEG 图像几乎没有作用,因此现在在解压缩此类图像时也被禁用。(因此,djpeg 无法再将无损 JPEG 图像解压缩为 GIF 图像。)
-
修复了 1.4 beta1[8] 中的一个疏忽,该疏忽在尝试使用启用了颜色量化和 RGB565 颜色转换的 djpeg 解压缩各种特制的格式错误的每组件 12 位 JPEG 图像时导致各种 segfaults 和缓冲区溢出。
-
修复了以下问题:如果启用了解压缩放,
jpeg_crop_scanline()
有时会错误计算具有 4x2 或 2x4 子采样因子的组件的下采样宽度。这导致组件上采样不完全,从而导致颜色转换器从未初始化的内存中读取。对于 12 位数据精度,如果从未初始化的内存读取的样本值超出了有效样本范围,则会导致缓冲区溢出或欠载以及随后的 segfault。 -
修复了一个长期存在的问题,即当
tj3Transform()
函数与TJXOP_TRANSPOSE、
TJXOP_TRANSVERSE
、TJXOP_ROT90
或TJXOP_ROT270
转换操作一起使用时,在没有自动的 JPEG 目标缓冲区(重新)分配或无损裁剪的情况下,基于源图像尺寸而不是转换后的图像尺寸计算最坏情况下转换的 JPEG 图像大小。如果一个调用程序按照 API 文档的指示,根据转换后的图像尺寸分配 JPEG 目标缓冲区,并试图转换一个特别制作的 4:2:2、4:4:0、4:1:1 或 4:4:1 的包含大量元数据的 JPEG 源图像,这个问题导致tj3Transform()
溢出 JPEG 目标缓冲区而不是正常失败。这个问题可以通过设置TJXOPT_COPYNONE
来解决。请注意,不管这个问题如何,tj3Transform()
都能不可靠地转换包含大量元数据的 JPEG 源图像,除非使用自动 JPEG 目标缓冲区(重新)分配或设置TJXOPT_COPYNONE
。 -
修复了 3.0 beta2[6] 引入的一个回归问题,该回归使得 djpeg
-map
选项在解压 12-bit-per-component 有损的 JPEG 图像时无法工作。 -
修复了在尝试将特制格式错误的算术编码 JPEG 源图像转换为 baseline Huffman-coded JPEG 目标时导致 C Huffman encoder (默认情况下在 x86 和 Arm CPU 上不使用)从未初始化的内存中读取的问题图像。
更新说明:https://github.com/libjpeg-turbo/libjpeg-turbo/releases/tag/3.0.0