Siv3D / OpenSiv3D

C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web)
https://siv3d.github.io/
MIT License
1k stars 138 forks source link

幅or高さがImageの上限(16384px)より大きいGIFファイルを読むとアクセス違反が起きるのを修正 #1171

Closed m4saka closed 8 months ago

m4saka commented 8 months ago

下記の不具合を修正しました。ご確認をお願いいたします。

不具合内容

Imageクラスで幅または高さが16384pxより大きいGIF画像を読み込もうとするとメモリアクセス違反が起きてプログラムがクラッシュする。

不具合原因

Imageクラスの幅・高さは16384pxが上限(Image::MaxWidthImage::MaxHeight)なので、それより大きいサイズで生成しようとするとImageクラスのコンストラクタで0px扱いになる。

しかし、GIFDecoder::decode内の下記では指定した幅・高さで初期化されていることを前提にポインタで操作していたため、Imageの幅または高さが0px扱いになった場合にはポインタが範囲外のアドレスを参照してアクセス違反が生じていた。 https://github.com/Siv3D/OpenSiv3D/blob/d6bff5978dff6046fbb05d70e80eb296a84b74a5/Siv3D/src/Siv3D/ImageFormat/GIF/GIFDecoder.cpp#L165-L182

修正内容

Image::operator bool()がfalseを返す(=画像が空である)場合はデコードを止めるように修正。 また、本件と直接関係はないがDGifCloseFileに漏れがあった箇所も修正。

Reputeless commented 8 months ago

Merged. Thanks!