[FreeBSD-users-jp 95203] sysutils/ufs_copy で SIGSEGV

Hidemi Yamashita happybsd at kiiroi.mimoza.jp
Tue May 20 08:35:58 UTC 2014


こんにちは。

いつの頃からか、ufs_copy の終了時にコアダンプを吐く様になって
いたので調べて見ました。9.1から含まれる様になった soft
updates journaling (SUJ) の変更により問題が発生する事が判りま
した。

取り敢えず、MLに流します。portsメンテナの方に対応して頂けると
有難いです。

問題発生状況:
コピーを行う際のソース側がデバイス、デスティネーション側がイ
メージファイルである場合に発生します。

原因:
ソース側に対して ufs_disk_fillout(3) を呼び出して作成した
struct uufsd を bcopy(3) を使用してデスティネーション側の
struct uufsd として使いまわしているので、SUJの対応に伴い追加
された d_sbcsum メンバのポインタ値もコピーされてしまう。コピー
処理後、ソース側の ufs_disk_close(3) を実行した後でデスティネー
ション側の ufs_disk_close(3) を実行するので、free(3) を同じポ
インタに対して2回呼び出す事になるので、この時点でコアダンプを
生成してしまう。

対策:
添付したパッチ(diff.txt)を以下の通り当ててインストールする。

make patch
patch < diff.txt
make
make install


--- 山下英美
-------------- next part --------------
--- work/ufs/ufs_copy.c.orig     2014-05-14 05:51:24.000000000 +0900
+++ work/ufs/ufs_copy.c  2014-05-14 05:51:30.000000000 +0900
@@ -289,6 +289,9 @@
		}
	}
	bcopy(&src, &dst, sizeof(dst));
+#if __FreeBSD_version >= 900011
+	dst.d_sbcsum = NULL;
+#endif
	dst.d_name = dst_path;
	dst.d_fd = open(dst_path, O_CREAT | O_WRONLY,  S_IRUSR |  S_IWUSR );
	if (dst.d_fd < 0) {


More information about the freebsd-users-jp mailing list