giflib 5.1.2不是线程安全的吗?

时间:2016-03-29 19:05:16

标签: c gif giflib

我正在使用giflib,并且发现如果我在关闭前一个文件之前打开一个新文件,那么一切都会崩溃。

  1. DGifOpen(文件A)
  2. DGifSlurp(文件A)
  3. DGifOpen(文件B)
  4. DGifSlurp(文件B) - D_GIF_ERR_READ_FAILED失败
  5. 这是非常了不起的,因为我可以使用自定义读取函数验证每次读取成功并返回请求的字节数。

    但是...

    1. DGifOpen(文件A)
    2. DGifSlurp(文件A)
    3. DGifClose(文件A)
    4. DGifOpen(文件B)
    5. DGifSlurp(文件B) - 有效!
    6. 文档说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 个答案:

答案 0 :(得分:1)

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

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

您正在使用API​​,重叠的多个打开应该可以正常工作。但是实现中可能存在一个错误 - 代码很老,而且其中一些代码在20年内还没有仔细查看过。

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