[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00154] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- Subject: [FDclone-users:00154] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Fri, 02 May 2003 22:47:18 +0900
しらいです。
In Message-Id <03May2.115040jst.119044@inetgw.lightwell.co.jp>
SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田@徹夜あけです。
> > 購入した担当者に確認してみます。
> これは、購入時の IBM 側営業マンにメールを投げたので、
> 結果は後日ということで。
> (門前払いの可能性が大ですが)
もしなにがしかの結果が得られたようなら教えて下さい。AIX 独
自の作法があるようなら、今後の参考にしないといけませんし。
> 小島さんのセキュリティホール memo で、 OpenSSH portable の
> version があがったネタを発見。
OpenSSH 自体は関係ないんですね?小島さんはこの AIX の件を
一緒に追ってくれてた筈なので、その成果として何か発見されたの
かと思ってしまいました。
> 「うーん、やっぱりハンドラー関数の中で自分を再度セットしてるよな。
> しかも、 signal() で。
> その上には waitpid() のループしかないしなー・・・・・
> waitpid() のループ!!!」
main() 用の handler だと確かにそうなんですが、fork() した
後の loop 用の handler では log を取るだけで何もしない実装に
なっているようです。
もし wait するか否かが鍵だとしたら、OpenSSH でも無限 loop
が発生している筈だと思いますが。
> ではと、[FDclone-users:00150] で書きました、かの暴走プログラムの
> main() にいる wait() をコメントにし、CatchSIGCHLD() の頭に
> waitpid() のループを入れたら見事に暴走がとまりました。
> (あのソースぐらいだとループにしなくても大丈夫でしたが)
> signal() でも sigaction() でも同じように動くようです。
もしそれが AIX の作法だとするとそれはまずいだろうと思いま
す。そもそも SIGCHLD の発生源と wait() の trigger とは別々に
用意されるべきですよね。
そうでないと、SIGCHLD handler で wait() を処理する必要があ
るなら、main stream 側の wait() で待っている箇所がいつまで経
っても抜けられなくなってしまいます。
shell の実装では子を待つことは重要なので、handler 内で処理
することが義務づけられてしまうと厄介なことになりますよ。
多分、そういう指示をする sigaction() 用 flag があって、AIX
標準の signal() ではそれを有効にしてしまっているというだけな
んじゃないでしょうか。
man page の記述を見る限りでは、SA_NOCLDWAIT と SA_NOCLDSTOP
くらいしか関係ありそうなものは見つかりませんが、一度 AIX の
signal() の仕様を確認しておいた方が良いかも知れません。
以下の source を compile すると、signal() が標準的に有効に
する sa_flags の値が判ります。この値を <signal.h> と見比べて、
SA_... のうちどれが有効になっているのか調べてみて貰えません
か?
---- Cut Here ----
#include <stdio.h>
#include <signal.h>
void handler(n)
int n;
{
}
main()
{
struct sigaction act, oact;
signal(SIGCHLD, handler);
act.sa_handler = SIG_DFL;
act.sa_flags = 0;
sigemptyset(&(act.sa_mask));
sigemptyset(&(oact.sa_mask));
sigaction(SIGCHLD, &act, &oact);
printf("%x\n", oact.sa_flags);
}
---- Cut Here ----
普通は SA_RESTART くらいしか有効にしないと思います。このく
らいは特に支障ない flag だと思いますが、まさか SA_RESTART の
せいで SIGCHLD 無限発呼なんてことはありませんよね?
ここで signal() の標準的な flag 値が判ったら、先に示してあ
る signal() の置換えで、sa_flags にその値をセットしてみて下
さい。それで無限ループが再現するようなら、その flag のせいだ
ということが明確になるでしょう。
しらい たかし