MAC OS XでIMAPサーバ

MacOS Xでdovecotをインストールすると、どうも認証で変な挙動をする。
一回目の認証は上手くいくのだが、二回目以降に
「Error: imap-login: No authentication sockets found」,「Error: child 737 (login) returned error 89」となる。
かなり以前からMac OS Xでdovecotを動作させることはトライしてたもののいつも同じ結果になる。

UW-IMAPの認証に失敗する件として以下のページを発見した。

env_unix.c の中では getpwnam() をなんどか呼び出しますが、それ ぞれ情報のコピーはしていない。通常、getpwnam() をよぶのは認証 すべきユーザの情報だけしかなく、uw-imap 自身のコード以外にget- pwnam() を呼び出すところもないため、正しく動作する。
しかし、Mac OS X の PAM は、そのプロセスで最初に呼び出された時 に一度だけ、root ユーザの情報を getpwnam() で取得する。そう、この時に env_unix.c の内部で確保していると思われている認証すべきユーザの情報が、root のものに書き換えられてしまう。
よって、PAMによる認証そのものは成功したものの、その後ユーザ情報が壊れている(rootのものになっている)ため、その後の諸々のチェックで失敗し、認証が失敗したかのような返答が返される。
実は、これは最初一回目の認証の身に起こる現象でくじけずもう一度認証を行うと、今度はPAMは初期化されているためgetpwnam() を 呼ぶこともなく、認証に成功する。しかし、通常のメールソフトは一度 認証に失敗したら一旦回線を切断し、その後リトライする。uw-imap は接続ごとに起動されるため、そのたびにPAMの初期化が発生し、 そのたびに1度目の失敗が発生する。
これは env_unix.c という UNIX一般で使われるコードの中にあるか なり重大な欠陥である。しかし、10.2 時代に使われていた ckp_stdでは getpwnam() を呼ぶような事はなかったため、また、他のUNIXでは PAMライブラリが getpwnam() を呼ぶことがないのか、これが問題になったことはない模様である。

現象としては同じではないが、認証のトラブルという面では似ている。

dovecot.confの中の認証部分で

auth default {
passdb pam {
args = dovecot
}

となっている部分がある。argsの内容で回避できる気がするのだが・・・。