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中に処理するようにしてしまいたいです。