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

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



 しらいです。

In Message-Id <20081115160814.2929748068C@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

>  debugger で細かく追うと判るとは思いますが、buffer overflow
> でもなきゃ明らかな bug です。結構執拗に追ってみたんですけど、
> buffer overflow は生じてなさそうなんですよね。

 もう少し深く追ってみました。先の mail で patch を当てた箇
所の関数は、巡り巡って自身を再帰的に呼び出しているのですが、
gcc の最適化によって reentrant になっていないようです。
 多分、私の書いたコードのせいではないと信じたいのですが、そ
もそも再帰的に呼ばれないようにしておいた方が安全だと思うので、
また別の patch も作ってみました。

---- 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 03:34:10 2008
@@ -492,9 +492,6 @@
 VOID_P bodyp;
 CONST char *path;
 {
-# if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE)
-	char conv[MAXPATHLEN];
-# endif
 	int n;
 
 	if (!bodyp) return;
@@ -512,16 +509,12 @@
 	openlist[n].type = type;
 	openlist[n].dev = dev;
 # if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE)
-	openlist[n].path = NULL;
+	openlist[n].path = strdup2(path);
 # endif
 
 	switch (type) {
 		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));
-# endif
 			break;
 		case OP_FD:
 			body_fd(n) = *((int *)bodyp);
@@ -939,7 +932,7 @@
 #endif
 #if	defined (DEP_KANJIPATH) || defined (DEP_ROCKRIDGE) \
 ||	defined (DEP_DOSEMU) || defined (DEP_URLPATH)
-	putopenlist(OP_DIRP, dev, dirp, cp);
+	putopenlist(OP_DIRP, dev, dirp, convput(conv, cp, 0, 1, NULL, NULL));
 #endif
 
 	return(dirp);
---- Cut Here ----

 再現性に乏しいのでどちらの patch が有効なのか自信がありま
せん。[FDclone-users:00836] の patch とこれと両方試してみて
貰えないでしょうか。
 どちらも素の FDclone 3.00c に対しての patch になっています
ので、一方で確認した後で一旦 3.00c に戻してから他方を適用す
る必要があります。
 patch を二重に適用してしまわないように気をつけて下さい。

                                               しらい たかし