Sleipnir 2.9.4 において特定サイトのソースが表示できない不具合の原因を究明しようとしてみた
友人から、
http://ow.ly/url/shorten-url このページ、Sleipnir 2.9.4 でソースが表示できない!なんで!気になる!
と言われて、気になって気になって夜も眠れなかったので、調べてみた。
普段使っているブラウザは次のような感じで、Sleipnir以外はちゃんと見られた。
- Google Chrome (ちょろめ!)
- Internet Explorer 6.0 〜 8.0
- Sleipnir
- Safari
- FireFox
今回はリバースエンジニアリングによるバグの原因究明を行った。
んで、一アプローチとして流れを書いてみた、というわけ!
現象の詳細
- 特定のサイトにおいて、右クリックメニューからのソース表示及びメニューバーから表示→ソースの表示を選んでも、ソースが表示されない現象が発生している。
- 今回確認したのは、次の2つのサイトのみ。
- ソースが表示できないサイトはなかなか見つからなかった。
原因究明のアプローチ
- 外部エディタを起動しているので、外部プログラムを起動するAPIを使っているはずである。
- 外部プログラムを起動するAPIは次の3つがぱっと考えられる。
- ShellExecute
- CreateProcess
- WinExec
- SleipnirはIE系コンポーネント(?)を使っているので、Sleipnirの実行モジュールの他、ieframeみたいな名前のモジュール等の上記API呼び出しにもブレークポイントをしかけて、ソースが表示できるサイトでソース表示を行う。
- →失敗。ブレークポイントに引っかからず。
- 今度はShellExecuteが定義されているモジュールに直接ブレークポイントを仕掛ける。
- →成功。
- そこからソースが表示できるサイトとできないサイトでの相違を確かめるべく、リバーストレース。
- ここからしばらくは 気合 努力 根性
- 結果、キャッシュファイルをCreateFileWする際に失敗していることが分かった。
- GetLastError及びFormatMessageからエラー内容を特定するために、まったく同じ呼び出し処理をC++で書く。
- どうやらファイルが存在していないらしい。
- そりゃ存在しないファイルは開けないわな、ということで原因箇所特定完了。
なぜサイトによって存在しないキャッシュファイル名になるのか
結論
以下は、上記の解析結果からの推論である。
- 今回のバグの原因
- Sleipnirは種類が利用不可のドキュメントに対して、勝手に拡張子をつけるため、そのキャッシュファイルが見つからず、ソースを表示することができない。
- 解決策
- 種類が利用不可能のドキュメントに対して、勝手に拡張子をつけるのをやめて、或いはすでに拡張子がついているファイルについては拡張子を除去すればよい。
あくまで推論です。