[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00618] Re: 仕切り直します。
- Subject: [FDclone-users:00618] Re: 仕切り直します。
- From: yuji tamura <yuji@isis.ocn.ne.jp>
- Date: Sat, 7 Oct 2006 15:42:45 +0900
こんにちは田村です。
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