[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:23855] Re: canna 3.5b2-24slink1
新保と申します.
"Kikutani, Makoto" <kikutani@xxxxxxxxxx> wrote:
> defaultではhosts.cannaが
>
> unix
> localhost
>
> になってるので凍るようですね。
>
> localhost
> unix
>
> だと、unixのほうにcannaserverはいないと怒るだけなんですが。
これ, 本当にそうですか?
canna-3.5b2-25 のソース (-24slink1 も該当部分に違いはない
ようです) を見ると
- hosts.canna にホスト名 "unix" とあれば, アクセス制御表
(これはホスト名ではなく IP アドレスの表) を作る際に,
(gethostname() で取得した) 自身のホスト名から IP アドレスを
(gethostbyname() で) 引いて, 表に入れる.
つまり, "unix" というホスト名を引きに行くわけではない.
(server/misc.c の CreateAccessControlList())
- ローカルな (UNIX) 接続要求が届いた場合には, 自身の
IP アドレスをアクセス制御表から検索し, あれば接続を許可する.
(server/misc.c の CheckAccessControlList())
ということをしているように見受けられます.
ですから, /etc/hosts.canna に書かれた "unix" と言う
ホスト名 (?) そのものが悪いとは思えません.
それに, unix の記述を削除すると, 自ホストから cannaserver
を利用する際にあらかじめ CANNAHOST=localhost と指定して
おかなければならなくなりませんか?
(TCP 接続はできても UNIX 接続ができなくなる.)
また, unix 行がないと cannakill も connection 拒否されて
失敗しませんか?
# だから /etc/init.d/canna で cannakill を使っているのは
# よくないですね. シグナル送って停止する方が良いのでは.
で, デバッガで追ってみると,
1. server/misc.c の CreateAccessControlList() には虫がいて,
hosts.canna ファイルの最後の行のホストが gethostbyname() で
引けなかったときに, free() した領域に書き込みを行ってしまう.
このため, fork() したあとで子プロセスが segmantation violation
で落ちてしまうが, 一方親プロセスは (zombie になってしまった)
子からのシグナルを延々待ち続ける, という状況のようです.
2. さらに, CreateAccessControlList() による /etc/hosts.canna の
解釈は,
- 行末の 1 文字は (改行文字であろうがなかろうが)
無条件で切り捨てる.
- 行 (というか, : で区切られたフィールド) 末の
ホワイトスペースを取り除かない.
という処理なので, 最後の行に正しいホスト名, あるいは unix と
*正しく* 書いてあったとしても,
- ファイル末の改行がない (この場合 unix -> uni となります),
- 改行があっても行末にスペースが紛れ込んでいる,
などの場合には, やはり gethostbyname() で失敗して 1. の理由で
ハング, ということになります.
思うに, 今回の報告者お二人の事例は, "unix" という記述とは無関係で,
- /etc/hosts.canna のファイル末に改行文字がないか,
最後の行末に余計な空白が入っていた, か, あるいは,
- gethostbyname() で自ホストの名前が引けない,
というのが理由なのでは?
とりあえず, 1. だけ修正する patch (canna_3.5b2-25 用) を
短いので下につけときます. これでハングすることはなくなるん
じゃないかと思うのですが, 本来は 2. も直すべきでしょう.
--
新保 仁 <shimbo@xxxxxxxxxxxxxxxxx>
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----
--- canna-3.5b2/server/misc.c Tue Jul 11 14:08:41 2000
+++ canna-3.5b2/server/misc.c.new Wed Sep 6 18:09:17 2000
@@ -560,8 +567,6 @@
current->next = (ACLPtr)NULL ;
prev = current ;
}
- if( current )
- current->next = (ACLPtr)NULL ;
fclose( fp ) ;
return 0;