2006年11月12日の日記の1番目の記事へのコメント
■gaim-2.0.0beta5 と ICQ
2chのスレ見たらこんな話が・・・.んなまさか.AIMのアカウントじゃ何もおこらんし.もしかしてICQだと起こるのかな?って自分のICQのアカウントって何だったっけ・・・.もう思い出せないや.
ICQのページに行って新規にアカウント取ったんですが,ふと見るとユーザ検索なんてのがありますな.げ,本名突っこんで検索したら古いの出てきたし.あれれ,こんなでっかい数字だったっけ? まあいいや
取ったアカウントでさっそくテストしてみると・・・見事に再現.落ちますね.あ,でもLinuxだと落ちません.何じゃこりゃ.2.0.0beta4で試してみても落ちます.なるほど.オフィシャル版だと落ちないということなので,念のためこちらのビルド環境を疑ってパッチ無し版をビルドしてみましたが,確かにこれだと落ちませんでした.
で,こっからが大変.MinGWのgdbでも入れりゃどこで落ちてるのかすぐ分かるだろうと思ったんですが,gdbかましてgaim動かそうとするとgdbが即落ち.動いているのattachしてもgaimが落ちたのに全然反応してくれずorz.使い方がよくわからんのですが,OllyDbgというのでちょっと動かしてみたらどうも「botch_utf」なる関数で落ちてるみたいです.でもバックトレースの見方がよくわからんのよね(´・ω・`)
ソースの方に戻ってパッチ見るとoscarでこの関数呼んでるのは3箇所.ええい,こうなったらprintfデバッグじゃ.って,何度か動かしてるとICQにログインできなくなりましたよ?なんか10分くらい待てとか言ってます.なんて厳しいんだ・・・(;´д`)
どうもgaim_prpl_oscar_convert_to_infotextで呼ばれるbotch_ucsで落ちてるみたいですねぇ.どれ,どんなテキストエンコードしてるのかメモリ内容表示させてみよう・・・って何かg_convertの返してきてる変換(UTF-8→UCS2)後の文字列長が異常に長いんですけど.もしかしてg_convertがおかしいのか?・・・と一瞬思ったんですがよく見ると変換後の文字列長だと思ってた変数は文字列長のポインタでしたorz.「*」1個つけて解決.
--- libgaim/protocols/oscar/oscar.c~ 2006-11-11 09:12:41.000000000 +0900 +++ libgaim/protocols/oscar/oscar.c 2006-11-13 01:34:44.000000000 +0900 @@ -4281,7 +4281,7 @@ charset = oscar_charset_check(str); if (charset == AIM_CHARSET_UNICODE) { encoded = g_convert(str, strlen(str), "UCS-2BE", "UTF-8", NULL, ret_len, NULL); - botch_ucs(encoded, ret_len); + botch_ucs(encoded, *ret_len); *encoding = "unicode-2-0"; } else if (charset == AIM_CHARSET_CUSTOM) { encoded = g_convert(str, strlen(str), "ISO-8859-1", "UTF-8", NULL, ret_len, NULL);
あれ?何でこれLinuxだと平気なんだ???たまたまか? ちなみにいじってて気づいたんですが,Windowsで日本語名のグループ作ってそこに他の人のICQアカウント分類するとLinux側で同じアカウントでログインした際にグループ名が豪快に化けますね.逆もまた然り.あと,メッセンジャー追加の承認要求も化けまくりっつーかLinux間でも化ける・・・と思ったけど拒否の方のメッセージは化けないな・・・.気になる・・・.どこ直せばいいんだこれ.
[コメントを書く]
2006年11月12日の日記の1番目の記事へのコメント
グループ名や通知メッセージはwin上のicqクライアントとの運用でそれなりにうまく行っていると思っていたのですが、ダメですか。encodingをSJISにしてもダメですかねぇ…