[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00547] Re: FDclone 2.08f has been released
- Subject: [FDclone-users:00547] Re: FDclone 2.08f has been released
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 09 Aug 2006 01:54:00 +0900
しらいです。
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 ----
しらい たかし