【发布时间】:2016-07-17 12:31:07
【问题描述】:
我正在使用 giflib,并发现如果我在关闭前一个文件之前打开一个新文件,一切都会崩溃。
- 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 报告未初始化的读取。
【问题讨论】: