この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2015年2月)

2015年2月27日

Bug-org 1133629 crash in mozilla::IMEContentObserver::OnMouseButtonEvent(nsPresContext*, mozilla::WidgetMouseEvent*)
初回投稿日時: 2015年02月27日01時37分29秒
カテゴリ: Mozilla Core Mozilla37 Mozilla38 TSF Windows バグ修正
SNS: (list)

Firefox 35での、top crashの第16位のバグです。

これは、IMEへ、マウスボタンのイベントが発生したことを通知するXPレベルのコードで発生しているのですが、当初はなんでこんなマイナーな操作で、16位という高頻度での発生なのか分かりませんでした。しかし、よくよく考えてみると、これは、未確定文字列が無くても動作する部分でクラッシュしているので、かなり深刻なことに気付きました。

実際に再現するテストケースを作る余裕も無かったので、スタックトレースから推測してみると、マウスボタンイベントの発生位置にある文字の情報をIMEContentObserverが取得する際に、ContentEventHandlerにクエリを投げた際に、最新のレイアウト情報が必要なため、ペンディングになっているリフローが全て実行されます。この際に、フォーカスを持ったエディタが非表示になったりして、エディタがフォーカスを失い、IMEContentObserver自身が破棄されると、その直後にメンバにアクセスしたタイミングで、クラッシュすることが分かりました。

そこで、リスクを最小限に抑えるために、IMEContentObserver::OnMouseButtonEvent()の内部で、ContentEventHandlerを利用する前に、kungFuDeathGripIMEContentObserverrefCountがゼロにならないようにして、破棄されるのを防ぎ、その後、IMEContentObserverが破棄されていないか確認するように修正しています。

ただ、Firefox 36のリリースまで1週間を切っていたため、残念ながら36にはこの修正は入っていません。

もし、特定のサイトでマウスをクリックした瞬間によく落ちる方が居たら、この修正が入ってる、37 Betaをインストールすれば、このクラッシュバグを回避することができます。

関連するかもしれないエントリ

bug-org 1133629を含むエントリ