pantasystem / Milktea

Misskey, MastodonのAndroidクライアント「Milktea」のソースコード
GNU General Public License v3.0
256 stars 22 forks source link

特定のapngをリアクションを表示することができない #461

Open pantasystem opened 2 years ago

pantasystem commented 2 years ago

以下のヘッダーを表示できない 89504E47

pantasystem commented 2 years ago
java.lang.IllegalArgumentException: Bad position 1127835099/11998
        at java.nio.Buffer.position(Buffer.java:259)
        at java.nio.ByteBuffer.position(ByteBuffer.java:812)
        at com.github.penfeizhou.animation.io.ByteBufferReader.skip(ByteBufferReader.java:24)
        at com.github.penfeizhou.animation.io.FilterReader.skip(FilterReader.java:20)
        at com.github.penfeizhou.animation.apng.decode.Chunk.parse(Chunk.java:42)
        at com.github.penfeizhou.animation.apng.decode.APNGParser.parseChunk(APNGParser.java:136)
        at com.github.penfeizhou.animation.apng.decode.APNGParser.parse(APNGParser.java:108)
        at com.github.penfeizhou.animation.apng.decode.APNGDecoder.read(APNGDecoder.java:78)
        at com.github.penfeizhou.animation.apng.decode.APNGDecoder.read(APNGDecoder.java:27)
        at com.github.penfeizhou.animation.decode.FrameSeqDecoder$5.run(FrameSeqDecoder.java:226)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.os.HandlerThread.run(HandlerThread.java:67)

ライブラリの不具合の可能性が高い

pantasystem commented 1 year ago

関連 https://github.com/pantasystem/Milktea/issues/976

pantasystem commented 1 year ago

:loading:などのカスタム絵文字を表示することができない

samunohito commented 1 year ago

何が起こってるのか調べてみました。

Bad position 1127835099/11998

上記を見て、想定外の値をAPNGのサイズ情報として読み取っている可能性があると考えました。 そこで、ライブラリにブレークポイントをはり、1127835099同様に想定外の数値をサイズ情報として読み取るまでアプリを動かしてみたところ、この現象が発生する画像側に問題があることがわかりました。

どこがおかしいかを分かりやすくするため、正常に表示できているAPNGと表示できていないAPNG(今回は:loading:)を比較してみました。

:ablob_fox_loading:(※) image

:loading: image

※こういうAPNGです。橙色の輪郭の中で黒い記号が回転しています image

正常に表示できているablob_fox_loadingはIENDチャンクでバイナリが終わっているのに対し、loadingはIENDチャンク以降にもバイナリが存在しています(IENDチャンクを選択して反転表示しています)。 ライブラリがこの余剰なバイトを読み込み、画像の要領である11998を大きく超える1127835099にアクセスしようとして本件の現象が発生しているようです。

参考: https://qiita.com/spc_ehara/items/c748ec636283df805926#iend%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF-1

samunohito commented 1 year ago

あと、ライブラリの2.23.0と2.24.0のソースを落としてdiffをとってみましたが、明確に怪しいと思われる差分はありませんでした…

pantasystem commented 1 year ago

おー!!助かります この辺はあまり知識がなくてどうすれば良いものかと見当すらついていなかったので とてもありがとたいです🙇🙇🙇

samunohito commented 1 year ago

たびたび失礼します。2点ほど…

pantasystem commented 1 year ago

原因の究明からPRまで本当に助かります🙏🏻🙏🏻 アサインいたしましたよろしくお願いします🙇🙇🙇