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

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



こんにちは田村です。

On Sat, 07 Oct 2006 01:37:37 +0900, Takashi SHIRAI wrote:

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

えーとこれは、「95桁、45行」の状態で確認する、ので良いのでしょうか?

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

これは、状況は変わらないようです、
「/Users/yuji/Documents/」において
「2 auc/」と言うディレクトリ名が消える事を確認しました/

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

「chat buf[1024];」は「char buf[1024];」
で良いんですよね?。

コメントアウト箇所は3ヶ所でしょうか?

-----browse.c-----
1036|	//buf = malloc2(col * KANAWID + 1);
1037|	i = (isstandout && fnameofs > 0) ? fnameofs : 0;

1044|		Xkanjiputs(buf);
1045|		//free(buf);
1046|		if (isstandout > 0) Xputterm(END_STANDOUT);

1109|	Xkanjiputs(buf);
1110|	//free(buf);
1111|#ifndef	_NOCOLOR
-----browse.c-----

なんか間違っているような気がするのですが..。
これでいいでしょうか?
この状態ですと、やはりファイル名が消える現象は起こります。

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

これもやはり、「/Users/yuji/Documents/」において
「12 test2/」と言うディレクトリ名が消える事を確認しました。


---
yuji tamura