2016-03-29 94 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)」。 –