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

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

もずはっく日記(2013年8月)

2013年8月31日

Bug-org 892606 Intermittent test_keycodes.xul | Exited with code -1073741819 during test run | application crashed [@ mozilla::widget::VirtualKey::GetNativeUniChars(unsigned char)]
初回投稿日時: 2013年08月31日11時22分36秒
カテゴリ: Mozilla Core Mozilla25 Mozilla26 Windows バグ修正
SNS: (list)

自動テストで、擬似的に生成されたネイティブキーイベントをハンドリングしている最中に、デッドキー処理中にクラッシュする、というバグです。

詳しいコードの履歴は覚えていないのですが、私が、WM_CHARの処理にも、widget::NativeKeyを使用するようになったのがそもそもの原因でした。ただ、その修正は24以前で行ったものなので、何が原因で25からクラッシュするようになったのかは分かっていません。ただ、攻撃には使えなさそうなクラッシュなので、クラッシュする25以降でのみ修正しました。

GeckoのWindowsのキーイベント処理はメッセージキューを見て、ちょっと特殊なことをやっています。通常の文字入力の場合、WM_KEYDOWNメッセージを処理中に、続くWM_CHARメッセージをキューから取り除いて、そのままkeypressイベントを生成してしまいます。

このため、ごくごく特殊な場合にしか、WM_CHARメッセージのハンドラが動くことはないのですが、今回の件は、その特殊な場合に当てはまっていた上に、デッドキーの特殊処理に入るパターンでした。

デッドキーを2回連続で入力した場合、WM_KEYDOWNWM_DEADCHARWM_KEYUPWM_KEYDOWNWM_CHARWM_CHARWM_KEYUPとなります。この、二つ目のWM_CHARも、2回目のWM_KEYDOWN中に処理されて、WM_CHARのハンドラが動くことはないと思っていたのですが、実際には、一つ目のWM_CHARだけが、WM_KEYDOWN中に処理され、残りのWM_CHARは、WM_CHARメッセージハンドラで処理されます。

この際に、デッドキーテーブルを参照する時に、配列の範囲外参照が発生してしまっていたので修正しています。将来的には、連続するWM_CHARWM_KEYDOWN中に処理するようにしてしまいたいです。

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

bug-org 892606を含むエントリ