Skip to content

fix: JXL null check, CMYK format, TIFF fallback, path overflow

Latest

Choose a tag to compare

@mfirewire mfirewire released this 05 Mar 00:49

Bug 修复(5 处)
SaveImage.cpp — SaveJXL 和 ConvertToJXL 共 3 处:

JxlReader::Compress 失败返回 NULL 时,直接 fwrite(NULL, ...) 会崩溃或写出空文件当成功 → 加 NULL check + throw
ConvertToJXL 里内层 unsigned char* pBuffer 是重新声明而非赋值,遮蔽了外层变量,导致 catch 块里 delete[] pBuffer 是 no-op,内存泄漏 → 改为赋值
CompressJPEG 返回 NULL 时 nSize 未初始化,fwrite 行为未定义 → 同样加 NULL check

ICCProfileTransform.cpp — GetCMYKProfile:

GetModuleFileNameA 失败时 path 未初始化,仍传入 cmsOpenProfileFromFile → 将 cmsOpenProfileFromFile 调用移入成功分支,缓冲区也从 +10 扩为 +16

PSDWrapper.cpp — CMYK transform 格式不匹配:

nChannels 先被强制设为 4,但 transform 却按 FORMAT_AKYMC(5 通道)创建,两者不一致会导致 ICC 转换输出错乱 → 先设 nChannels = 4,再统一用 FORMAT_YMCK

ImageLoadThread.cpp — TIFF → WIC fallback:

带着 OutOfMemory = true 进入 ProcessReadWICRequest,若 WIC 也失败上层会误判为 OOM → 在 fallback 前先重置

性能优化(2 处)
JXLWrapper.cpp:

DoCompress 初始缓冲 4096 字节,对任何真实图片都会触发多轮 resize + memcpy → 改为 1 MB 起步
Compress 里先 memcpy 整块再逐像素 swap R/B,两次遍历 → 改为单次循环直接做 BGR→RGB 拷贝,同时修复 G 通道在极端情况下可能未被拷贝的隐患