書庫タイプのSusieプラグインで、圧縮ファイル中の画像を開く際のバッファサイズについて
お世話になってます。
自作のSusieプラグインを作成していたところ、気になる挙動がありました。
(提案というより情報共有です)
GetArchiveInfo()
で取得した filesize
と、GetFile()
で返す HLOCAL
のバッファサイズが異なると、
既知の不具合 の 「圧縮ファイル中の画像を開こうとすると落ちる」が発生してしまいました。
現在のNeeViewの実装だと GetArchiveInfo()
の filesize
を基準に HLOCAL
のバッファから読み取っていると思いますが、
それだと仮想化アーカイブのプラグイン(axpathlist,axshellなど)や、GetArchiveInfo()
時に正確なサイズが確定できないプラグインでアクセス違反が発生する可能性があると思います。
他のSusieプラグイン対応のアプリケーション(LeeyesやMassigra, マンガミーヤ) は、LocalSize()
でバッファサイズを取得し直しているようですので、
互換性を向上するために 同様の処理にてはいかがでしょうか。
ご検討をよろしくお願いします。
Comments (8)
-
repo owner -
repo owner Susieでのメモリーチェック強化 (refs
#334) 画像読み込み失敗時にサムネイル画像からエラーメッセージ画像に切り替わらないバグ修正→ <<cset 226077bed41a>>
-
repo owner Bitmapフォーマットとしての余分なサイズになるため,バッファのマージンをなくした (refs
#334)→ <<cset f1358960f853>>
-
repo owner - changed status to resolved
LocalSize() を使用して領域外メモリアクセスをしないよう制限してみました。
実は現象の発生する書庫プラグインを把握しておらず、この対処で良いか自信がありません(汗)。 もしよろしければでいいのですが、ご確認していただけるとありがたいです。 > udaken様
-
reporter 対応ありがとうございます。
アクセス違反していた事例では、発生しない様になりました。 参考までに、アクセス違反が発生していた事例を記載しておきます。
1. axpathlist2.spi(http://artisticimitation.web.fc2.com/adbtest/)を有効にする 2.画像を含んだ、適当なパスリストリスト(.sz7)を作成する。 3.NeeViewでパスリストリスト(.sz7)を開く(GetArchiveInfo()が呼び出される) 4.上記画像ファイルを、元のファイルより小さなファイルに差し替える 5.NeeViewで上記画像を開く
個人的には、
filesize
とLocalSize()
の両方を加味するのではなく、 バッファサイズ =LocalSize()
で取得したサイズでいいかと思います。
Leeyes、マンガミーヤもこの様な動きですし。
(Issueの説明に書いた「 LocalSize() でバッファサイズを取得し直している」という記載で混乱されたかもしれませんが)IntPtr pBuff = Win32Api.LocalLock(hBuff); var buffSize = (int)Win32Api.LocalSize(hBuff); if (buffSize ==0) throw new ApplicationException("Memory error."); byte[] buf = new byte[buffSize]; Marshal.Copy(pBuff, buf, (int)0, buffSize); return buf;
ただ、それにより
LocalAlloc()
でバッファサイズを多く確保するプラグイン(存在するかわかりませんが)で問題が発生するかもしれません。 -
repo owner ご確認と詳細な情報ありがとうございます!
個人的には、 filesize と LocalSize() の両方を加味するのではなく、 バッファサイズ = LocalSize() で取得したサイズでいいかと思います。
Leeyes、マンガミーヤもこの様な動きですし。
:
ただ、それにより LocalAlloc() でバッファサイズを多く確保するプラグイン(存在するかわかりませんが)で問題が発生するかもしれません。tar32.spi(tar32.dllの拡張子をspiにしたもの)でバッファサイズが要求サイズより1バイト多いことを確認しております。おそらくマージンだと思われます。 この+1された取得バッファサイズを使用しても特に問題は発生しておりませんし、足りなくなるよりはよいと思いますので、ご提案どおり取得バッファサイズをそのまま使うよう変更いたします。
-
repo owner Susieアーカイブエントリーの取得にLocalSize()で取得した値をそのまま使用するようにした。 (refs
#334)→ <<cset 661c2c051cb5>>
-
repo owner - changed status to closed
- Log in to comment
情報ありがとうございます。
実のところ当方、WIN32アプリ作成経験がなく、このSusieプラグイン対応も参考サイトを見ながらの手探り実装になっております。 折りを見て勉強させていただきます。