我正在使用giflib,并且发现如果我在关闭前一个文件之前打开一个新文件,那么一切都会崩溃。
这是非常了不起的,因为我可以使用自定义读取函数验证每次读取成功并返回请求的字节数。
但是...
文档说giflib是re-entrant and thread-safe
。
那么,为什么有多个打开的文件呢? GifFileType应该封装所有状态;并且文件A和文件B的用户端数据结构之间没有重叠。
更新&相关问题:giflib是否打算安全地处理恶意输入文件,还是针对该场景的错误工具?我没有在测试系统中看到valgrind的任何自动使用,我似乎无法找到该项目的CI服务器。
更新:这与重叠文件无关,而是giflib 5.1.2仅在堆归零时才有效 - 未初始化的读取导致失败。重叠读取只是一种触发方式 那。
要重现,请下载giflib 5.1.2和
./autogen.sh
make check
cd util && cat ../pic/porsche.gif | valgrind .libs/lt-gifsponge
答案 0 :(得分:1)
我是giflib维护者,也是DGifSlurp()入口点的原作者。
4.x和5.x之间的重大变化是从库中消除了静态存储。旧的API无法重入,因为图像状态有一些静态指针。
您正在使用API,重叠的多个打开应该可以正常工作。但是实现中可能存在一个错误 - 代码很老,而且其中一些代码在20年内还没有仔细查看过。
我会和你一起工作。首先要做的是找出抛出错误的位置;有14种不同的出口可以设置代码。