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

[FDclone-users:00836] Re: FreeBSD/ports for 7.0R



 しらいです。

In Message-Id <491ECEE6.2080707@imao.jp>
        Yasushi Imao <yasushi_imao@imao.jp>さんwrites:
> お世話になります。今尾です。

> tcsh でログインして、fdsh を起動した状態でも実験していましたが、まったく
> 同様です。

 となると login shell がどうのというのは関係ありませんね。
他の shell で login してから fd を起動して EXECUTE_SH の中で
補完を行なっても再現するんじゃないでしょうか。


> 私も FreeBSD と Linux (Ubuntu 8.04、CentOS 5) で試して、FreeBSD でのみ再
> 現しましたので、FreeBSD の最近のバージョン固有と思っていましたが、
> Solaris 10 X86 でも login shell として利用する、fdsh を他の shell からっ
> 起動するの両方の方法で再現できました。Solaris 環境で日本語を使う機会があ
> りませんでしたので気がつきませんでした。

 Solaris10 は持ってるので確認してみましたが、またもや再現し
ませんでした。

$ uname -a
SunOS solaris10 5.10 Generic_118844-08 i86pc i386 i86pc
$ pwd
/home/fdclone/utf8/テスト
$ cat ~/.fdshrc
if [ -f ~/.fd2rc ]; then
	. ~/.fd2rc
fi
$ cat ~/.fd2rc
FNAMEKCODE=utf8
$ dir

 Directory of /home/fdclone/utf8/テスト

.              <DIR>        08-11-15  23:35 .
..             <DIR>        08-11-15  23:35 ..
111      TXT             0  08-11-15  23:35 111.txt
111            <DIR>        08-11-15  23:35 111
1日本語        <DIR>        08-11-15  23:35 1日本語
         1 file(s)              0 bytes
         4 dir(s)     206,387,200 bytes free
$ echo 1 (←ここで Tab)
111       111.txt   1日本語
$ echo 1


> EUC で作成した "テスト" に対して LANG=ja_JP.EUC 環境下で "ln -s テスト
> test" を実行し、UTF-8 では cd test で行いました。pwd で current
> directory をみると /home/yimao/tmp/test になったので、再現させるのは無理
> かと思いましたが、この状態でも再現 (FNAMAKCODE="utf8" で freeze) できま
> した。

 ふむ、こっちのケースは Solaris10 で再現しました。

 色々試してみたところ、下記のような対処で再現しなくなったん
ですが、そちらの環境ではどうでしょう?もしかすると UTF-8 な
directory の件も再現しなくなりませんか?

---- Cut Here ----
diff -u ../old/FD-3.00c/sysemu.c ./sysemu.c
--- ../old/FD-3.00c/sysemu.c	Sun Jul 27 00:00:00 2008
+++ ./sysemu.c	Sun Nov 16 00:50:21 2008
@@ -493,7 +493,7 @@
 CONST char *path;
 {
 # if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE)
-	char conv[MAXPATHLEN];
+	char *cp, conv[MAXPATHLEN];
 # endif
 	int n;
 
@@ -519,8 +519,8 @@
 		case OP_DIRP:
 			body_dirp(n) = (DIR *)bodyp;
 # if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE)
-			openlist[n].path =
-				strdup2(convput(conv, path, 0, 1, NULL, NULL));
+			cp = convput(conv, path, 0, 1, NULL, NULL);
+			openlist[n].path = strdup2(cp);
 # endif
 			break;
 		case OP_FD:
@@ -1036,7 +1036,7 @@
 	return(pseudoreaddir(dirp));
 #else	/* DEP_DOSEMU || DEP_URLPATH || DEP_KANJIPATH || DEP_ROCKRIDGE */
 # if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE)
-	char path[MAXPATHLEN], conv[MAXPATHLEN];
+	char *cp, path[MAXPATHLEN], conv[MAXPATHLEN];
 # endif
 	static st_dirent buf;
 	struct dirent *dp;
@@ -1086,7 +1086,8 @@
 # if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE)
 	if (n >= 0) {
 		strcatdelim2(path, openlist[n].path, src);
-		if (convget(conv, path, dev) == conv) {
+		cp = convget(conv, path, dev);
+		if (cp == conv) {
 			if ((src = strrdelim(conv, 0))) src++;
 			else src = conv;
 		}
---- Cut Here ----

 変更点を見て貰うと判ると思いますが、もしこの patch で直る
としたら、多分それは compiler の最適化 bug ですよ。関数の返
り値を意味もなく一旦変数に格納しただけですから。
 変数に格納しないでそのまま引数にして渡した場合、何故かポイ
ンタ値が NULL になっていました。返り値は NULL じゃないのにど
こかでいつの間にかすり変わってますね。
 debugger で細かく追うと判るとは思いますが、buffer overflow
でもなきゃ明らかな bug です。結構執拗に追ってみたんですけど、
buffer overflow は生じてなさそうなんですよね。

 もしこれが原因なら特定の OS に依存するという現象にも説明が
つきますね。FreeBSD も Solaris も gcc を使っているかと思いま
すが、環境によって version がまちまちですから。
 因みにうちの Solaris の gcc はこんなのでした。

$ gcc --version
gcc (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


> 日本語 directory 配下の tab 補完は結構頻繁に使う機会があると思うんです
> が、私のところだけで再現するところをみると、どうやら私個人の設定/使用方
> 法に問題にあるような気がしてきました。実はこの問題は以前から発生していた
> んですが、再現条件が特定できていませんでしたので、他の方から報告があるの
> を期待して待っていました。ですが、一向にその気配がありませんでしたので、
> 今回思い切ってご相談させていただきました。が、結局お騒がせしただけに終わ
> りそうで少し残念です。

 もし compiler のせいだとすると個人の問題に近いところがある
とは思いますが、影響範囲は一個人よりはまだ広いので、対応可能
な限りは対応したいと思っています。
 結論はまだ出ていませんが、私も最後まで諦めずに対応していく
つもりですので、ご面倒でも気長におつき合い下さい。

                                               しらい たかし