バグ #1227
完了本文に実体参照を含むツイートにEntityも含まれていた場合、インデックスがずれる
説明
再現手順を実行すると、以下のようなバックトレースを出力してmikutterがクラッシュすることがあった。
もう一度起動すると正常に起動するが、REST APIリクエストが完了してTLにツイートが反映された後にクラッシュする。そのさいのバックトレースも以下の内容と同じ。
/home/toshi/Projects/mikutter/core/plugin/twitter/twitter.rb:472:in `score_by_regexp': undefined method `partition' for nil:NilClass (NoMethodError) from /home/toshi/Projects/mikutter/core/plugin/twitter/twitter.rb:458:in `score_by_screen_name_regexp' from /home/toshi/Projects/mikutter/core/plugin/twitter/twitter.rb:308:in `block (2 levels) in <top (required)>' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/filter.rb:28:in `filtering' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:59:in `block (2 levels) in filtering' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:58:in `each' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:58:in `reduce' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:58:in `block in filtering' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:57:in `catch' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:57:in `filtering' from /home/toshi/.gem/ruby/2.5.0/gems/pluggaloid-1.1.1/lib/pluggaloid/plugin.rb:63:in `filtering' from /home/toshi/Projects/mikutter/core/plugin/score/select.rb:7:in `score_by_score' from /home/toshi/Projects/mikutter/core/plugin/score/select.rb:41:in `block (2 levels) in score_expand' from /home/toshi/Projects/mikutter/core/plugin/score/select.rb:39:in `each' from /home/toshi/Projects/mikutter/core/plugin/score/select.rb:39:in `block in score_expand' from /home/toshi/Projects/mikutter/core/mui/cairo_markup_generator.rb:34:in `each' from /home/toshi/Projects/mikutter/core/mui/cairo_markup_generator.rb:34:in `each' from /home/toshi/Projects/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject' from /home/toshi/Projects/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list' from /home/toshi/Projects/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class' from /home/toshi/Projects/mikutter/core/mui/cairo_miracle_painter.rb:350:in `main_message' from /home/toshi/Projects/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class' from /home/toshi/Projects/mikutter/core/mui/cairo_coordinate_module.rb:48:in `height' from /home/toshi/Projects/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class' from /home/toshi/Projects/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message' from /home/toshi/Projects/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri=' from /home/toshi/Projects/mikutter/core/plugin/gtk/mainloop.rb:10:in `main' from /home/toshi/Projects/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop' from /home/toshi/Projects/mikutter/mikutter.rb:68:in `boot!' from /home/toshi/Projects/mikutter/mikutter.rb:104:in `<main>'
再現手順
- 凍結されたmikutterのCKを使ったアカウントの認証を解除する
- mikutterを終了し、CK/CSを有効なものに書き換える
- mikutterを起動する
- 適当なTwitterアカウントでWorldを作成する
toshi_a 初音 さんが6年以上前に更新
雑なprintデバッグで、text noteのdescriptionがセットされずに作られてることが確認できた。nilガードで場当たり的に対応できなくもないが、根本的に直すべきですね
if !note.description.is_a?(String)
error "model: #{message.inspect}, note: #{note.inspect}"
end
Akira Ouchi さんが6年以上前に更新
git rebaseで適当に遡って確かめた感じ、以下のコミットからクラッシュするようになったようです。
https://dev.mikutter.hachune.net/projects/mikutter/repository/revisions/0be9a6fc56c75bb5a92c3e6eec5fb596b06d9b3c
toshi_a 初音 さんが6年以上前に更新
/home/toshi/Projects/mikutter/core/plugin/score/model/text_note.rb:11:in `initialize': Invalid description value `nil'. (RuntimeError) from /home/toshi/Projects/mikutter/core/plugin/twitter/twitter.rb:357:in `new' from /home/toshi/Projects/mikutter/core/plugin/twitter/twitter.rb:357:in `score_by_entity' ...
Divaにnullability実装してなかったっけ(痴呆)などと言いながら問題箇所を確認したところ(twitter.rb:357)
if cur != text.size
score << Diva::Model(:score_text).new(
description: text[cur...text.size])
end
String#[]にRangeを渡した場合、一部の状況においてnilを返すので 、このあたりの処理がおかしいようですね。
toshi_a 初音 さんが6年以上前に更新
/home/toshi/Projects/mikutter/core/plugin/twitter/twitter.rb:361:in `score_by_entity': base string: "> mikutterのtterは、過去のTwitterからとったもので、現在のTwitterのそれではありません。 (RuntimeError) // mikutterのTwitterコンシューマキーが凍結されました - mikutter blog https://t.co/glpccypbrp", range: 137...134
Range#firstがlastより大きな値になってますが、この時のlastはdescription#size、firstは寸前のTwitter Entityのlastの値なので、Twitter Entityのインデックスとしてそもそも間違った値が送られてきているか、例外の考慮漏れである可能性が出てきました。
toshi_a 初音 さんが6年以上前に更新
descriptionが返す文字列の、>などを>などに置き換えていますが、この置き換えによってEntityのインデックスがずれてしまうことが原因だということがわかりました。
descriptionの返す文字列ではこのような置き換えを行わず、TwitterプラグインがTextNoteを作るタイミングで置き換えるべきでしょう。
toshi_a 初音 さんが6年以上前に更新
- 題名 を CK/CSを書き換えてから認証するとクラッシュする から 本文に実体参照を含むツイートにEntityも含まれていた場合、インデックスがずれる に変更