averageがアンダーフローして数億になってる。いうバグ報告をいただいたのだが誰から聞いたのか思い出せん。sched_setscheduler()にレースがあることが分かって、治したので今後はおきないはず。あつかいがちょっと変わります。端的にいうとNetBSDちっくな動きになりました。バックグランドを説明すると、NPROCはユーザあたりのプロセス数を制限する機能であると。端的にいうとプロセス数超過するとforkがEAGAIN返して失敗する。プロセスを作る方法は1つしかないから一見自明に見える。ところが「ユーザあたりのプロセス数」というのがキモで、プロセスの所有ユーザを変えてしまうという手がある。setuidされたプログラムに対するexec()族である。従来Linuxはset*uid()族はNPROCチェックをしてEAGAINを返していたが、execではチェックしていなかった。ついでにいうとforkでのチェックもちゃんとロックされてなかったので、プロセス数の厳密な保証はもとから無かった。NPROCなんてしょせんforkbomb対策のオモチャだから適当でいいんだよ。いうのはLinusの弁。set*uid()でチェックすると何が問題かというと、POSIX的にはset*uid()は正しい引数を与える限りにおいて失敗しないので、かなり著名なソフトでも誰も返値をチェックしてない。ついでにいうとLinuxはmanページからしてEAGAINの記載がないというていらくで(※ごめん、いま見直したらmanにはちゃんと書いて有ったわ)エスパーでもない限り失敗するケースを思いつく人はいないという状況だった。set*uid()を使う場面というのは(ごく一部の例外を除いて)端的に言えばrootが非rootに変身して権限を落とすということであるので、ここで失敗してかつエラーチェックを怠るとroot権限をもったまま信頼できないプログラムをexecするアホdaemonが出来上がる。権限を落とすシステムコールを失敗させるのはセキュリティ的にたいへん危険なので、権限昇格させるほう、つまりexec族で失敗させるのが正しいんじゃね?という意見が提出された。3つをつづけて呼ぶのでチェックがsetuidからexecに変わっても、実質の動きはかわらんでしょう、と。いつものように互換性がにゃーにゃー、戻り値をチェックしないプログラムがワンワンと騒いでいたのだが、たまたまtwitterでsodaさんがNは何年も前からexecでチェックしてるとつぶやいていたのでLinusに転送してみたら採用されてしまった。そのあと互換性議論が復活して、setuid使ってないプロセスはexec失敗しないよう仕様が若干変更され、現在の使用は・set*uid()時にNPROC超過を検出し、かつ・その後のexecでも再びNPROC超過を検出したときのみexecがEAGAINを返す。なっているというわけで、この件でなにか困った事にぶちあたった人がいたらsodaさんをdisるといいと思うよ。・・・という免責事項を軽くジャブしたあとでいうのもなんですけど、NetBSDのみなさんはRLIMIT_NPROCのコメントやドキュメントで「Linuxと違ってNetBSDはhogehoge」などと説明してるところをいちいち治して回る刺身たんぽぽの作業をするといいと思うよ。教育プログラム導入実証」http://www.ipa.go.jp/software/open/ossc/seika_1005_1.htmlあとでみる。不具合修正などがありました。commits)でした。コミッターのみなさん今年もお疲れさまでした!ハハッ・・・そんなばかな。ばかな・・・・そんなにコミットしているわけがない。skin:cuteblogリサーチ無料アクセス。