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

[FDclone-users:00154] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)



 しらいです。

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 のせいだ
ということが明確になるでしょう。

                                               しらい たかし