[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00142] Symlink の扱いに関するバグ
- Subject: [FDclone-users:00142] Symlink の扱いに関するバグ
- From: Hironao Komatsu <s1100089@u-aizu.ac.jp>
- Date: Thu, 17 Apr 2003 12:53:21 +0900
はじめまして、小松です。よろしくお願いします。
今回の投稿は、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>