2016-03-29 141 views
2

我正在使用giflib,并且发现如果我在关闭前一个文件之前打开一个新文件,所有地狱崩溃。giflib 5.1.2不是线程安全的吗?

  1. DGifOpen(文件A)
  2. DGifSlurp(文件A)
  3. DGifOpen(文件B)
  4. DGifSlurp(文件B) - 失败D_GIF_ERR_READ_FAILED

哪个是显着的,因为我可以使用自定义读取函数验证每次读取成功并返回请求的字节数。

但是......

  1. DGifOpen(文件A)
  2. DGifSlurp(文件A)
  3. DGifClose(文件A)
  4. DGifOpen(文件B)
  5. DGifSlurp(文件B ) - 作品!

该文件说giflib是re-entrant and thread-safe

那么,为什么如果有多个打开的文件很重要? GifFileType应该封装所有的状态;并有文件A和文件B


更新&相关问题,用户端的数据结构之间没有重叠:是giflib旨在安全地处理恶意输入文件,或者是它那种情况下错误的工具?我在测试系统中看不到任何自动使用valgrind,我似乎无法找到该项目的CI服务器。


更新:这有没有关系重叠的文件,而是与giflib 5.1.2只有当堆归零工作的事实 - 未初始化读是导致失败。重叠读取只是触发 的一种方法。

复制,下载giflib 5.1.2,并

  1. 运行./autogen.sh
  2. 运行make check
  3. 然后cd util && cat ../pic/porsche.gif | valgrind .libs/lt-gifsponge
  4. 关注的valgrind报告未初始化的读取。

回答

1

我是giflib维护者,也是DGifSlurp()入口点的原作者。

4.x和5.x之间的巨大变化是从库中消除了静态存储。旧的API不能重新进入,因为图像状态有一些静态指针。

您正在使用API​​,重叠的多个打开应该可以工作。但是在实现中可能存在一个错误 - 代码非常陈旧,其中一些代码在20年内还没有被仔细研究过。

我会和你一起工作。首先要做的是找出错误发生的位置;有像14个不同的出口可以设置代码。

+0

谢谢!我正在设置一个失败的测试。 –

+0

看起来好像有堆腐败,所以它可能不是giflib的错,只是巧合。它在某个测试套件中以某种顺序100%可重复,但在其他地方没有。 –

+0

实际上不是堆腐败。 - >“DGifSetupDecompress,DGifG​​etImageDesc,DGifSlurp”中的“条件跳转或移动取决于未初始化的值(s)”。 –