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:
Tweet (list)
自動テストで、擬似的に生成されたネイティブキーイベントをハンドリングしている最中に、デッドキー処理中にクラッシュする、というバグです。
詳しいコードの履歴は覚えていないのですが、私が、WM_CHAR
の処理にも、widget::NativeKey
を使用するようになったのがそもそもの原因でした。ただ、その修正は24以前で行ったものなので、何が原因で25からクラッシュするようになったのかは分かっていません。ただ、攻撃には使えなさそうなクラッシュなので、クラッシュする25以降でのみ修正しました。
GeckoのWindowsのキーイベント処理はメッセージキューを見て、ちょっと特殊なことをやっています。通常の文字入力の場合、WM_KEYDOWN
メッセージを処理中に、続くWM_CHAR
メッセージをキューから取り除いて、そのままkeypress
イベントを生成してしまいます。
このため、ごくごく特殊な場合にしか、WM_CHAR
メッセージのハンドラが動くことはないのですが、今回の件は、その特殊な場合に当てはまっていた上に、デッドキーの特殊処理に入るパターンでした。
デッドキーを2回連続で入力した場合、WM_KEYDOWN
、WM_DEADCHAR
、WM_KEYUP
、WM_KEYDOWN
、WM_CHAR
、WM_CHAR
、WM_KEYUP
となります。この、二つ目のWM_CHAR
も、2回目のWM_KEYDOWN
中に処理されて、WM_CHAR
のハンドラが動くことはないと思っていたのですが、実際には、一つ目のWM_CHAR
だけが、WM_KEYDOWN
中に処理され、残りのWM_CHAR
は、WM_CHAR
メッセージハンドラで処理されます。
この際に、デッドキーテーブルを参照する時に、配列の範囲外参照が発生してしまっていたので修正しています。将来的には、連続するWM_CHAR
をWM_KEYDOWN
中に処理するようにしてしまいたいです。