我正在使用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)」。 –