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

[FDclone-users:00547] Re: FDclone 2.08f has been released



 しらいです。

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

>  2.08e の時に「最後の総決算」と言っておきながらこの体たらく。
> しかも、release した直後にも拘らず既に bug 報告が届いていま
> す。

 bug が判っているのに放置するのも忍びないので、その詳細報告
及び patch を挙げておきます。

 下手にややこしいロックの仕組みを導入するものではありません
で、案の定、ログファイルのロックに失敗していた訳です。
 殆んどの system call に対し、ログファイルにその結果が書込
まれるのですが、ログファイル書込み処理内でロック処理関数を呼
んでまして、そいつがログを吐こうとして無限再帰に...。
 従来はログファイル処理では system call の wrapper を使わず
に素の system call を呼んでいたのですが、ロック処理が複雑に
なったので wrapper の方を呼ぶようにしてしまっていました。

 wrapper の方が高機能で何かと重宝はするので、system call し
か使わない実装に戻す代わりに、ログファイル処理関数は再帰呼出
禁止にしました。
 恒久対策では、他の system call も wrapper 関数に置換えて、
全体としての整合性を取っておこうと思います。

---- Cut Here ----
diff -u ../old/FD-2.08f/log.c ./log.c
--- ../old/FD-2.08f/log.c	Tue Aug  8 00:00:00 2006
+++ ./log.c	Wed Aug  9 00:43:17 2006
@@ -109,6 +109,7 @@
 char *buf;
 int len;
 {
+	static int logging = 0;
 	lockbuf_t *lck;
 	struct tm *tm;
 	char hbuf[MAXLOGLEN + 1];
@@ -116,6 +117,7 @@
 	u_char uc;
 	int n;
 
+	if (logging) return;
 #ifndef	NOUID
 	if (!getuid()) {
 		n = rootloglevel;
@@ -126,6 +128,7 @@
 	n = loglevel;
 	if (!n || n < lvl) return;
 
+	logging = 1;
 	if ((lck = openlogfile())) {
 		t = time(NULL);
 		tm = localtime(&t);
@@ -148,6 +151,7 @@
 		VOID_C write(lck -> fd, &uc, sizeof(uc));
 		lockclose(lck);
 	}
+	logging = 0;
 #ifndef	NOSYSLOG
 	if (usesyslog && syslogged >= 0) {
 		if (!syslogged) {
---- Cut Here ----

                                               しらい たかし