チケット #27774

登録: 2012-03-07 23:40

最終更新: 2012-07-02 22:19

ホスト側UTF-8ファイルのSJIS変換ダウンロードでクラッシュ

報告者:(匿名)担当者:(未割り当て)
優先度:5 - 中マイルストーン:(未割り当て)
チケットの種類:バグ重要度:5 - 中
コンポーネント:(未割り当て)状況:完了
解決法なし

チケットの詳細

Windows7SP1(x64)で1.98eを使用(他のバージョンはチェックしていません)。ホスト側文字コードUTF-8、ローカル側文字コードSJISでファイルをダウンロードするとクラッシュ(動作を停止しました)する場合があります。

【再現方法】

1. ホスト側コードをUTF-8、ローカル側コードをSJISとする

2. ローカル側のffftp-1.98e-src\doc\jpn\FFFTP.txtをアップロード(UTF-8に変換)

3. ホスト側FFFTP.txtをダウンロードすると(SJISに変換を期待)、「動作を停止しました」ダイアログで終了となります。

デバッガで追いかけた限りだと、ConvUTF8NtoSJIS()の変換中にpUTF16バッファ終端にU+FFFDが現れた場合に文字数カウントがずれてcInfo->StrLenがマイナスになり、次回読み込みで巨大なmalloc()を試みてしまっているようです。バッファ内の条件に依存するようで、history.txtはうまくいきます。

添付ファイル

添付ファイルリスト
1.diff (4KB)
santa_report によって 2012-03-11 12:37 に登録されました [File ID: 4704]
ファイルの説明: 1.98eに対するパッチ
FFFTP.txt (15KB)
santa_report によって 2012-03-11 12:44 に登録されました [File ID: 4705]
ファイルの説明: ホスト側に置いたUTF-8のFFFTP.txt
2.diff (4KB)
santa_report によって 2012-03-11 12:49 に登録されました [File ID: 4706]
ファイルの説明: 1.98eに対するパッチ訂正版(memmove使用)
新規添付ファイル追加
添付ファイルの追加添付ファイルの追加にはログインが必要です

チケットの履歴 - 12 件中 3 件表示 [古い履歴も表示する]

2012-03-07 23:40 更新者: None

  • 新しいチケット "ホスト側UTF-8ファイルのSJIS変換ダウンロードでクラッシュ" が作成されました

2012-03-09 13:32 更新者: s_kawamoto

コメント

ご報告ありがとうございます。 変換できたUTF-16から元のUTF-8の長さを求めるコードに問題があったようで、testブランチで修正しました。 http://git.sourceforge.jp/view?p=ffftp/ffftp.git;a=commit;h=a7acbb14a190ab47c087c1059b1d4742e637ef34

2012-03-09 22:42 更新者: None

コメント

s_kawamoto への返信

ご報告ありがとうございます。 変換できたUTF-16から元のUTF-8の長さを求めるコードに問題があったようで、testブランチで修正しました。 http://git.sourceforge.jp/view?p=ffftp/ffftp.git;a=commit;h=a7acbb14a190ab47c087c1059b1d4742e637ef34

修正ありがとうございます。転送は終わるようになりましたが、境界にひっかかった箇所(以前はクラッシュ)の1文字で???への文字化けが発生しています。こう直せばよいってところまで追いきれていませんが、まずは現象だけの報告です。

2012-03-10 00:58 更新者: s_kawamoto

コメント

修正前は潜在的なバグがあったものの、まず初めの報告の内容が再現できないのですが、修正後も不具合があるとするとお使いの環境に問題があるような気がします。 とりあえずコードページを明示的に指定してみました。 http://git.sourceforge.jp/view?p=ffftp/ffftp.git;a=commit;h=607cd5899fe0ff3692e440cc5fd27e1b21a6cd77

2012-03-11 12:37 更新者: santa_report

  • 添付ファイル 1.diff (File ID: 4704) が付加されました

2012-03-11 12:43 更新者: santa_report

コメント

s_kawamoto への返信

修正前は潜在的なバグがあったものの、まず初めの報告の内容が再現できないのですが、修正後も不具合があるとするとお使いの環境に問題があるような気がします。

再現できないとのことですので、1.98eのソース(testブランチではないです)に対してパッチを作成してみました。 ConvUTF8NtoSJIS()のみ修正しています。他のコード変換関数は見ていません。 ホスト側に置いたUTF-8のFFFTP.txtをUTF-8⇒SJIS変換で転送。初回0xd90バイト読み込みで試しています。Windows7で試しているので、WindowsXP以前で悪影響が無いかは未確認ですごめんなさい。

2012-03-11 12:44 更新者: santa_report

  • 添付ファイル FFFTP.txt (File ID: 4705) が付加されました

2012-03-11 12:49 更新者: santa_report

  • 添付ファイル 2.diff (File ID: 4706) が付加されました

2012-03-12 00:48 更新者: s_kawamoto

コメント

わざわざパッチまで作成していただきありがとうございます。 diffのコメントを読むと原因はWindows Vista以降で不完全な文字がU+FFFDに変換されることのようですが、U+FFFDを特別扱いすると、UTF-8側にU+FFFDが含まれている場合に処理できなくなるので、UTF-8とUTF-16 LE間の変換の処理を自前で実装し、Windows XPのMultiByteToWideChar()とWideCharToMultiByte()をエミュレートしてみました。 http://git.sourceforge.jp/view?p=ffftp/ffftp.git;a=commit;h=2fb62f9065c1e3df9d82414f4055f2d0747ae7ed

2012-03-12 22:01 更新者: santa_report

コメント

s_kawamoto への返信

わざわざパッチまで作成していただきありがとうございます。 diffのコメントを読むと原因はWindows Vista以降で不完全な文字がU+FFFDに変換されることのようですが、U+FFFDを特別扱いすると、UTF-8側にU+FFFDが含まれている場合に処理できなくなるので、UTF-8とUTF-16 LE間の変換の処理を自前で実装し、Windows XPのMultiByteToWideChar()とWideCharToMultiByte()をエミュレートしてみました。 http://git.sourceforge.jp/view?p=ffftp/ffftp.git;a=commit;h=2fb62f9065c1e3df9d82414f4055f2d0747ae7ed

ご指摘の通り、UTF-8にU+FFFD(EF BF BD)が含まれている場合はUTF-16変換時に(FFFD)になっているのでパッチとしてはまずかったです。 また、その後みつけた文字コードまわりのセキュリティの話( http://gihyo.jp/admin/serial/01/charcode )を見ると、もっとよくよく考えてパッチかかないとダメでした。変なパッチ書いてごめんなさい。

一方、修正されたバージョンのRelease版EXEをダウンロードして試してみましたが0xd90バイト読み込んだ後の次の文字が化けてしまいました。

ソースからVC++2008 Express Editionでデバッグビルドして追いかけると、なぜか標準ランタイムのMultiByteToWideChar()とWideCharToMultiByte()が呼ばれていたようなので、それぞれAlternative()付きに書き換えてみましたが、UTF16Length = MultiByteToWideCharAlternative(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length); の戻り値が0になってしまってダメでした。

再現できないような環境依存の問題で、他の方で問題が起きないようでしたら、UTF-8/UTF-16間とはいえ自前変換はセキュリティリスクがあるので以前のバージョンで結構です。

2012-07-01 22:23 更新者: s_kawamoto

コメント

ご迷惑おかけしました。 Windows Vista以降でUTF-8のテキストファイルやファイル名をShift_JISに変換する時に破損するバグを1.98fブランチで修正しましたのでご確認ください。 http://git.sourceforge.jp/view?p=ffftp/ffftp.git;a=commit;h=6e2f6a0d16d98a75a7e1f80470d01b1672e64727

2012-07-02 22:19 更新者: s_kawamoto

  • チケット完了時刻2012-07-02 22:19 に更新されました
  • 状況オープン から 完了 に更新されました

追記/更新 #27774 (ホスト側UTF-8ファイルのSJIS変換ダウンロードでクラッシュ)

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする