automountはtime(NULL)が0の時にバグる

autofs(automount)time(2)の返り値が0の時に、アクセスしたプロセスからトラップして動こうとするmountに失敗して-ENOENTが返る。少なくとも現時点の最新版のv5.1.1で起こる。

automountには「最後にmountしようとして失敗した時からN秒間は再度のmountのトライをせずに抜けてくる」という判定をする箇所があるが、この「時刻になるまでは再度のmountトライをしない」の時刻の初期値が0になっている。なので、time(NULL)が0の時、automountは「まだ再度のmountトライをするような時刻じゃない」と判断して、すぐにエラーを返す。

バグの直し方は、簡単なように見えて厳密には難しい。time(2)の返り値はtime_t型だけど、time_tのビット幅やsignedやはPOSIX的には定義されていないようなので、0より小さい値を入れるのが可能かがわからない。なので、0を特別な値として扱うようにするような直し方が考えられる。けどオーバフローして0になった場合とかとかいろいろめんどい。まぁそもそもtime_tがオーバフローするような環境だと他にもっと重大な問題が起こりそうだけど。(わからない人は2038年問題でググって。)

まぁ幸いにも、Linuxの今時の32ビットCPUアーキではtime_tはlongでsignedの64bitなので、0ではなく-1あたりに初期化するよう直せば問題なさそう。・・・てかそれ以前にautomountはLinux前提だからあまりUNIX標準を考えなくてもいいのかもしれない。

このブログ記事について

このページは、らるるが2016年5月 2日 01:54に書いたブログ記事です。

ひとつ前のブログ記事は「ねんどろいど鏡音リン future style その2」です。

次のブログ記事は「letsencrypt使って無料でHTTPS対応」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0