幅or高さがImageの上限(16384px)より大きいGIFファイルを読むとアクセス違反が起きるのを修正 #1171
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
下記の不具合を修正しました。ご確認をお願いいたします。
不具合内容
Imageクラスで幅または高さが16384pxより大きいGIF画像を読み込もうとするとメモリアクセス違反が起きてプログラムがクラッシュする。
不具合原因
Imageクラスの幅・高さは16384pxが上限(
Image::MaxWidth
、Image::MaxHeight
)なので、それより大きいサイズで生成しようとするとImageクラスのコンストラクタで0px扱いになる。しかし、
GIFDecoder::decode
内の下記では指定した幅・高さで初期化されていることを前提にポインタで操作していたため、Imageの幅または高さが0px扱いになった場合にはポインタが範囲外のアドレスを参照してアクセス違反が生じていた。OpenSiv3D/Siv3D/src/Siv3D/ImageFormat/GIF/GIFDecoder.cpp
Lines 165 to 182 in d6bff59
修正内容
Image::operator bool()
がfalseを返す(=画像が空である)場合はデコードを止めるように修正。また、本件と直接関係はないがDGifCloseFileに漏れがあった箇所も修正。