2016-03-29 4 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はすべての状態をカプセル化する必要があります。 giflibが安全に悪質な入力ファイルを処理するためのものであるか、それはそのシナリオのための間違ったツールです。そしてそこに、ファイルAとファイルB


更新&関連する質問に対するユーザ側のデータ構造の間に重複がないのですか?私はテストシステムで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の「条件付きジャンプまたは移動は初期化されていない値に依存します。 –

関連する問題