書庫タイプのSusieプラグインで、圧縮ファイル中の画像を開く際のバッファサイズについて

Issue #334 closed
udaken created an issue

お世話になってます。

自作のSusieプラグインを作成していたところ、気になる挙動がありました。
(提案というより情報共有です)

GetArchiveInfo() で取得した filesize と、GetFile() で返す HLOCAL のバッファサイズが異なると、 既知の不具合 の 「圧縮ファイル中の画像を開こうとすると落ちる」が発生してしまいました。

現在のNeeViewの実装だと GetArchiveInfo()filesize を基準に HLOCAL のバッファから読み取っていると思いますが、 それだと仮想化アーカイブのプラグイン(axpathlist,axshellなど)や、GetArchiveInfo() 時に正確なサイズが確定できないプラグインでアクセス違反が発生する可能性があると思います。

他のSusieプラグイン対応のアプリケーション(LeeyesやMassigra, マンガミーヤ) は、LocalSize() でバッファサイズを取得し直しているようですので、 互換性を向上するために 同様の処理にてはいかがでしょうか。

ご検討をよろしくお願いします。

Comments (8)

  1. Ito Mitsuhiro repo owner

    情報ありがとうございます。

    実のところ当方、WIN32アプリ作成経験がなく、このSusieプラグイン対応も参考サイトを見ながらの手探り実装になっております。 折りを見て勉強させていただきます。

  2. Ito Mitsuhiro repo owner

    Susieでのメモリーチェック強化 (refs #334) 画像読み込み失敗時にサムネイル画像からエラーメッセージ画像に切り替わらないバグ修正

    → <<cset 226077bed41a>>

  3. Ito Mitsuhiro repo owner

    LocalSize() を使用して領域外メモリアクセスをしないよう制限してみました。

    実は現象の発生する書庫プラグインを把握しておらず、この対処で良いか自信がありません(汗)。 もしよろしければでいいのですが、ご確認していただけるとありがたいです。 > udaken様

  4. udaken reporter

    対応ありがとうございます。

    アクセス違反していた事例では、発生しない様になりました。 参考までに、アクセス違反が発生していた事例を記載しておきます。

    1. axpathlist2.spi(http://artisticimitation.web.fc2.com/adbtest/)を有効にする
    2.画像を含んだ、適当なパスリストリスト(.sz7)を作成する。
    3.NeeViewでパスリストリスト(.sz7)を開く(GetArchiveInfo()が呼び出される)
    4.上記画像ファイルを、元のファイルより小さなファイルに差し替える
    5.NeeViewで上記画像を開く
    

    個人的には、 filesizeLocalSize() の両方を加味するのではなく、 バッファサイズ = 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() でバッファサイズを多く確保するプラグイン(存在するかわかりませんが)で問題が発生するかもしれません。

  5. Ito Mitsuhiro repo owner

    ご確認と詳細な情報ありがとうございます!

    個人的には、 filesize と LocalSize() の両方を加味するのではなく、 バッファサイズ = LocalSize() で取得したサイズでいいかと思います。
    Leeyes、マンガミーヤもこの様な動きですし。

    ただ、それにより LocalAlloc() でバッファサイズを多く確保するプラグイン(存在するかわかりませんが)で問題が発生するかもしれません。

    tar32.spi(tar32.dllの拡張子をspiにしたもの)でバッファサイズが要求サイズより1バイト多いことを確認しております。おそらくマージンだと思われます。 この+1された取得バッファサイズを使用しても特に問題は発生しておりませんし、足りなくなるよりはよいと思いますので、ご提案どおり取得バッファサイズをそのまま使うよう変更いたします。

  6. Log in to comment