我正在使用giflib,并且发现如果我在关闭前一个文件之前打开一个新文件,所有地狱崩溃。giflib 5.1.2不是线程安全的吗?
- DGifOpen(文件A)
- DGifSlurp(文件A)
- DGifOpen(文件B)
- DGifSlurp(文件B) - 失败D_GIF_ERR_READ_FAILED
哪个是显着的,因为我可以使用自定义读取函数验证每次读取成功并返回请求的字节数。
但是......
- DGifOpen(文件A)
- DGifSlurp(文件A)
- DGifClose(文件A)
- DGifOpen(文件B)
- DGifSlurp(文件B ) - 作品!
该文件说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
- 关注的valgrind报告未初始化的读取。
谢谢!我正在设置一个失败的测试。 –
看起来好像有堆腐败,所以它可能不是giflib的错,只是巧合。它在某个测试套件中以某种顺序100%可重复,但在其他地方没有。 –
实际上不是堆腐败。 - >“DGifSetupDecompress,DGifGetImageDesc,DGifSlurp”中的“条件跳转或移动取决于未初始化的值(s)”。 –