[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00579] Re: やって見ましたが??
- Subject: [FDclone-users:00579] Re: やって見ましたが??
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Tue, 19 Sep 2006 22:30:39 +0900
しらいです。
In Message-Id <20060919185319.155580.422ba766@isis.ocn.ne.jp>
yuji tamura <yuji@isis.ocn.ne.jp>さんwrites:
> こんばんは、田村です。
> 以前の作業の結果が残っていると困るので、以前のディレクトリは削除し
> 新しくアーカイブを展開し直してから、作業しました。
賢明な処置だと思います。もしくは、「make realclean」でもそ
れとほぼ同等のことが実現可能です。勿論、一から新しく構築する
方が確実性は上回りますが。
> >一番怪しそうなのは dosemu.c でしょうかね。
>
> こういう事でしょうか?
> -----dosemu.c-----
> #include "func.h"
> #undef MAXPATHLEN
> #define MAXPATHLEN 65536
> ------------------
そういうことです。でもこれではまずかったようですね。
> 再コンパイルして
> [yuji:~/work/FD-2.09] yuji% ./fd
> Segmentation fault
> [yuji:~/work/FD-2.09] yuji%
> と落ちてしまいます。
多分 Xgetwd() で落ちているんだと思います。この中の getcwd()
の第二引数が MAXPATHLEN なのですが、関数呼出し側で規定された
バッファサイズを越えてしまうので、呼出し側の MAXPATHLEN も同
様に大きくしないといけないんでしょうね。
getcwd() の引数のところだけ「MAXPATHLEN」の代わりに元の値
を即値で書いておくと、普通に起動出来たりはしませんかね?元の
値は以下のようにして調査可能です。多分 1,024 かな。
---- Cut Here ----
#include <stdio.h>
#include <sys/param.h>
main()
{
printf("%d\n", MAXPATHLEN);
}
---- Cut Here ----
> -----dosemu.c-----
> struct dirent *Xreaddir(dirp)
> DIR *dirp;
> {
> #if defined (_NODOSDRIVE) && defined (_NOKANJIFCONV) \
> && defined (_NOROCKRIDGE)
> return(pseudoreaddir(dirp));
> #else /* !_NODOSDRIVE || !_NOKANJIFCONV || !_NOROCKRIDGE */
> # if !defined (_NOKANJIFCONV) || !defined (_NOROCKRIDGE)
> char path[MAXPATHLEN * 2], conv[MAXPATHLEN * 2];
> int i; ^^^^ ^^^^
> ------------------ ここ ここ
> と言う事でしょうか?再コンパイルした結果は、
> fd は正常に起動するが、症状は変わらずです。
だとすると他のところの MAXPATHLEN でしょうね。それを片っ端
から上のように置換えてみると、どこかの MAXPATHLEN を大きくし
た時点で症状が収まる筈です。
全部手動で置換えるのは気が遠くなりそうなので、machine.h 辺
りに「#define MAXPATHLEN2 65536」とか書いておいて、各 *.c の
中の MAXPATHLEN を全部 MAXPATHLEN2 に置換えるといいでしょう。
この時、バッファサイズとしての MAXPATHLEN は置換えますが、
それ以外の MAXPATHLEN はそのままにしておきます。でないと上の
getcwd() と同じことが置きますから。
この作業は次のような shell script で実現出来ます。
---- Cut Hete ----
#!/bin/sh
for f in *.c; do
sed -e 's/\[MAXPATHLEN/[MAXPATHLEN2/g' ${f} > ${f}.tmp
mv ${f}.tmp ${f}
done
---- Cut Hete ----
これでどうなるか試してみて、症状が収まるようなら次のステッ
プに進みます。MAXPATHLEN2 を一つずつ MAXPATHLEN に戻していく
訳です。
まずはファイル単位で戻しましょう。#include "fd.h" もしくは
#include "machine.h" の直後に以下の記述を挿入します。一ファ
イル戻したら compile して動作確認です。
#undef MAXPATHLEN2
#define MAXPATHLEN2 MAXPATHLEN
この作業を繰返し、どこで症状が再現するようになるかを確認し
ます。再現したら、そのファイルの中の MAXPATHLEN は元に戻して
はいけないということです。
戻してはいけないファイルからは上記の記述を削除して次のファ
イルに進みます。これで、戻してはいけないファイルを全て洗い出
します。
ファイルが特定出来たら MAXPATHLEN2 単位で戻しましょう。特
定されたファイルを編集し、MAXPATHLEN2 を一つずつ MAXPATHLEN
に戻しては compile して動作確認です。
この作業を繰返し、どこでまた症状が再現するようになるかを確
認します。再現したら、その MAXPATHLEN2 は元に戻してはいけな
いということです。
こうすると、MAXPATHLEN2 のまま残っているのが一つかせいぜい
数個になると思うので、その箇所を重点的に調べることで修正への
糸口が掴めると思います。
根気との勝負になりますが試してみて下さい。
しらい たかし