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

[FDclone-users:00142] Symlink の扱いに関するバグ



はじめまして、小松です。よろしくお願いします。

今回の投稿は、Symlinkの扱いについてバグと思われるものに関してです。
僕は、Vine Linux 2.6r1(i386)でFDcloneを使用していますが、
FD-2.03、FD-2.03aには、多くのSymlinkを含むディレクトリにおいて
操作を行うとSegmentation faultするバグがありました。
browse.c の896行目
	free(buf);
でSEGVが起こることから、ヒープ領域の破壊の可能性を疑い、
Linuxディストリビューションの多くに含まれる"ElectricFence"を
リンクし、以下の結果を得ました。

(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
infobar () at browse.c:679
679					tmp[i] = '\0';
(gdb) list
674			else {
675				tmp = malloc2(width * 2 + l + 1);
676				i = Xreadlink(fnodospath(path, filepos),
677					tmp, width * 2 + l);
678				if (i >= 0) {
679					tmp[i] = '\0';
680					strncpy3(&(buf[len]), &(tmp[l]), &width, 0);
681				}
682				free(tmp);
683			}
(gdb) print width * 2 + l + 1
$1 = 19
(gdb) print i
$2 = 21

これより、Xreadlinkが正しくない値を返したことがわかったので、
以下のパッチ(unified diff形式):

--- dosemu.c~	2003-03-26 00:00:00.000000000 +0900
+++ dosemu.c	2003-04-17 11:06:13.000000000 +0900
@@ -581,7 +581,7 @@
 #else
 	path = lbuf;
 #endif
-	strncpy(buf, path, bufsiz);
+	for (len = 0; len < bufsiz && path[len]; len++) buf[len] = path[len];
 	return(len);
 }
 

により正しいlenを返すようにし、バグを解消しました。

--------
Hironao Komatsu <s1100089@u-aizu.ac.jp>