Bug-org 1133629 crash in mozilla::IMEContentObserver::OnMouseButtonEvent(nsPresContext*, mozilla::WidgetMouseEvent*)
初回投稿日時: 2015年02月27日01時37分29秒
カテゴリ: Mozilla Core Mozilla37 Mozilla38 TSF Windows バグ修正
SNS:
Tweet (list)
Firefox 35での、top crashの第16位のバグです。
これは、IMEへ、マウスボタンのイベントが発生したことを通知するXPレベルのコードで発生しているのですが、当初はなんでこんなマイナーな操作で、16位という高頻度での発生なのか分かりませんでした。しかし、よくよく考えてみると、これは、未確定文字列が無くても動作する部分でクラッシュしているので、かなり深刻なことに気付きました。
実際に再現するテストケースを作る余裕も無かったので、スタックトレースから推測してみると、マウスボタンイベントの発生位置にある文字の情報をIMEContentObserver
が取得する際に、ContentEventHandler
にクエリを投げた際に、最新のレイアウト情報が必要なため、ペンディングになっているリフローが全て実行されます。この際に、フォーカスを持ったエディタが非表示になったりして、エディタがフォーカスを失い、IMEContentObserver
自身が破棄されると、その直後にメンバにアクセスしたタイミングで、クラッシュすることが分かりました。
そこで、リスクを最小限に抑えるために、IMEContentObserver::OnMouseButtonEvent()
の内部で、ContentEventHandler
を利用する前に、kungFuDeathGrip
でIMEContentObserver
のrefCount
がゼロにならないようにして、破棄されるのを防ぎ、その後、IMEContentObserver
が破棄されていないか確認するように修正しています。
ただ、Firefox 36のリリースまで1週間を切っていたため、残念ながら36にはこの修正は入っていません。
もし、特定のサイトでマウスをクリックした瞬間によく落ちる方が居たら、この修正が入ってる、37 Betaをインストールすれば、このクラッシュバグを回避することができます。