[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:49774] Re: tcshがセグメンテーション違反



こうもとです。

>  幸い、ソースを入手することは可能なので、気が向いたときに調べてみよ
> うかと思います。

 調べてみました。
 多バイト環境全て(EUC-JPだけでなく)で、特定条件が重なると発生するよ
うです。

 肝となる部分は、sh.lex.c ファイルの wide_read() 関数です。

 履歴ファイルからバイト指定で読み込んだ(read())後、読み込んだ内容を
ロケールの1文字ずつ取り出して(mbtowc())います(sh.lex.c:1716)。
 このとき、ファイルから読み込んだ情報の最後が多バイト文字の途中で切
れていた場合に、1文字が取り出せず、取得文字数が不正となり、サイズ計
算が狂います。狂うサイズが大きければ、その後で落ち、そうでなくてもそ
の部分は文字化けします。

 これを解決するには、ファイルから読み込んだときに、最後が多バイト文
字の途中の場合(文字として不正の場合?)は、その直前までを読み込んだこ
とにすればよいかと思いました。ところが、履歴を保存するためのエリアは、
最後の1バイトまできっちり使ったときにだけ追加で確保するロジックとなっ
ています(sh.lex.c:1809)。

 ロジック自体を変えないと、この問題は解決しないような気がしてきまし
た。
 何か良い修正方法はないでしょうか(そろそろ、他力本願モード)。


 再現環境を容易に作成するために、4096バイトの境界のみを多バイト文字
にした履歴ファイルを作りました。
 この履歴ファイルを、ja_JP.eucJPの環境で読み込むと、文字化けするは
ずです。1バイトずらせば、文字化けしないことが確認できます。

======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi@xxxxxxxxx

Attachment: .history
Description: Binary data