[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;