繁体   English   中英

giflib 5.1.2不是线程安全的吗?

[英]Is giflib 5.1.2 not thread-safe?

我正在使用giflib,并且发现如果我在关闭前一个文件之前打开一个新文件,那么所有的地狱都会破裂。

  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 cd util && cat ../pic/porsche.gif | valgrind .libs/lt-gifsponge
  4. 观看valgrind报告未初始化的阅读。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM