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

[debian-users:43558] stoneが切れる(gccの問題?)



すがのです。
BTSに投げようかと思ってたのですが、ちょっと迷ってしまったので相談させ
てください。

Debianパッケージのstone 2.2-1をsidで利用しようとしてるのですが、繋いで
すぐコネクションが切れるのです。

$ stone localhost:23 2023
$ telnet localhost 2023
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


Linux (yuki) (ttyp0)

yuki login: Connection closed by foreign host.

と、ログインネームを入れようとキーを押した途端切断されます。

それで原因をちょっと追っかけてみたのですが、どうもよくわからない現象に
ぶちあたってしまいました。

デバッガの使い方を学習する機会が無かったもので、デバッグプリントで確認
したのですが、stone.cの2820行目のclockという変数が問題でした。

	    if (idle && pair->timeout > 0
		&& time(&clock), clock - pair->clock > pair->timeout) {

という条件式なのですが、この下で

message(LOG_NOTICE,"Clock: %d",clock);

というデバッグプリントを埋め込んで見ました。
するとこのようなメッセージがstoneのログに記録されました。

May 15 00:31:08 Clock: -1073745496

この変数は time_t で宣言されてるので、マイナスになるということは無いと
思いますし、順次演算子でtime(&clock)が実行されてる(はず)なのでこんな値
になるとは思えないのですが……。

ともかくおかしいのはここだということで、以下のようなパッチを適用してみ
ました。

diff -ur stone-2.2.origsrc/stone.c stone-2.2/stone.c
--- stone-2.2.origsrc/stone.c	2005-05-15 01:42:03.405957628 +0900
+++ stone-2.2/stone.c	2005-05-15 01:42:30.041216152 +0900
@@ -2816,8 +2816,9 @@
 		    ASYNC(asyncReadWrite,pair);
 		}
 	    }
+	    time(&clock);
 	    if (idle && pair->timeout > 0
-		&& time(&clock), clock - pair->clock > pair->timeout) {
+		&& clock - pair->clock > pair->timeout) {
 		if (pair->count > 0 || Debug > 2) {
 		    message(LOG_NOTICE,"TCP %d: idle time exceeds",sd);
 		    message_pair(pair);

これでちゃんとプラスの値がclockに入り、問題なく動きました。

原因がgccの順次演算子の処理にあるのか、それともlinuxかglibcの時間関数
の扱いに問題があるのか、はたまた順次演算子のこのような使い方がそもそも
未定義なのか、私の知識ではこれ以上はわかりません。

どちらにBTSしたものでしょうか?
もしこの原因がお分かりになる方がいらっしゃいましたら、適切なところにバ
グ報告してくださるとありがたく思います。

-- 
狐志庵
Sugano Yoshihisa(E) <mailto:koshian@xxxxxxxxxxx>
Website: <http://www.misao.gr.jp/~koshian/>
PGP fingerprint [6367 2352 3995 214E B954  A1FE 33D9 C918 606F 7C15]