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

[FDclone-users:00614] Re: 仕切り直します。



 しらいです。

In Message-Id <20061005200424.362567.80c00eec@isis.ocn.ne.jp>
        yuji tamura <yuji@isis.ocn.ne.jp>さんwrites:
> こんばんは、田村です。

> 今日「/User2/yuji/Documents」の再現条件確認のための作業をして
> いた時に気付いたのですが、普通私はターミナルを「95桁、45行」で使用
> しているのですが、「125桁、45行」に広げて使っていた所、
> 素の fd v2.09 でもファイル名、ディレクトリ名が消えない事に
> 気付きました。

 この箇所に関して、ふと思いついたことがあるので三つほど検証
をお願いします。これも一旦素の 2.09 に戻してからお試し下さい。

 この一連のファイル名が消える現象で、実際にそのファイル名を
表示しているのは browse.c: putname() という関数です。この中
に malloc() が一つあって、このサイズが端末サイズに依存します。
 ここで確保した領域サイズが実際に使用する量を越えてしまって
いたとしたら、buffer overflow が生じてファイル名の格納された
領域を上書きしてしまっているかも知れません。

1) 領域を多めに確保しよう
 putname() の中に一箇所ある malloc2() の引数を大きくしてみ
ましょう。元は「col * KANAWID + 1」ですが「col * 128 + 1」く
らいにしてみるとどうでしょうかね?

2) 領域サイズを固定値にしよう
 malloc() で確保しないで最初から大きめの配列にしましょう。
putname() 冒頭の「char *buf;」という宣言を「chat buf[1024];」
に書換えます。
 配列にすると malloc()/free() でエラーになるので、putname()
の中の malloc()/free() は全部 comment out して下さい。

3) 領域を埋めるのをやめよう
 putname() の最後の方で、確保した領域を空白文字で埋めている
箇所があります。これが buffer overflow を起こしてるかも知れ
ないので comment out しましょう。こんな(↓)感じ
//	while (len < width) buf[len++] = ' ';

 どれも逐一素の 2.09 に戻してから試して下さい。同時に試して
も意味がないので一つずつお願いします。

                                               しらい たかし