[Armadillo:09406] ntpclient で事故

Yasuhisa Nakamura email@hidden
2014年 1月 9日 (木) 02:50:06 JST


中村です。

久しぶりに、不具合+修正情報です。

1月7日の午前8時ころ、同じソフトを入れている数10台の
Armadillo-420うちの10数台のシステムクロックが一斉に
2036.2.7になってしまった、という報告を受けました。

ntpclinetを使って1時間に1回、ntp.nict.go.jpで
時刻合わせをしています。

調べてみると、どうやらこれ↓が原因のようです。
http://www2.nict.go.jp/aeri/sts/tsp/PubNtp/qa.html#q4-2

[Q.4-2] 2036年2月7日になってしまった
[A.4-2]
  本NTPサーバは起動時に、NTP時刻をゼロリセットしますが、
  NTP時刻で「ゼロ」とは1900年1月1日 0:00:00 (UTC)を表します。
  この時、クライアントによっては、32ビット整数値の最大値42億
  9496万7295秒後(2036年2月7日 6時28分15秒 (UTC))の次の秒として
  扱うものもあります。しかし、本サーバでは、正しい時刻を設定
  するまでは、Stratum=0 (unspecified or invalid) としてサーバ
  応答しますので、Stratumも併せて参照してください。

ntpclinetのソースを見ると、Stratum値のチェックをせずに
システムクロックを書き換えています。

実際のNTPサーバでの再現試験は無理ですが、ntpclientのソースを
いじって受信した時刻を0(ゼロ)にしてみたところ、システム
クロックが2036年2月7日 6時28分16秒になってしまいました。

とりあえず、システムクロックを書き換える前にStratum値が
ゼロでないことをチェックするようなパッチを当てたのですが、
気になったのでntpclientの最新のバージョンを調べてみました。

ソースはここにあります。
http://doolittle.icarus.com/ntpclient/
過去のもおいてあって、
    ntpclient_2000_339.tar.gz
    ntpclient_2000_338.tar.gz
    ntpclient_2000_337.tar.gz
    ntpclient_2000_345.tar.gz
    ntpclient_2003_194.tar.gz (do not use)
    ntpclient_2006_318.tar.gz (do not use)
    ntpclient_2007_365.tar.gz
    ntpclient_2010_365.tar.gz (current)
atmark-distのものと比較してみると、distに入っているのは
2003年バージョンのようです。
do not use というコメントが・・・・

2003年から順に中身をみていくと、今回問題になった部分は、
2006年版では修正がなされていました。

めったに起きることではないかもしれませんが、
ntpclientを使うアプリを作るときは、2007年版か2010年版に
差し替えることをお勧めします。
(まだ私自身、差し替えはやっていないので、atmark-distで
ビルドできるか、わかりませんけど・・・)

atmark-distの次のリリースで入れ替えてもらえると嬉しいカモ。

#ntpclientなんか使わないでntpdで調整しろって声も聞こえて
#きそうですが、今回はそういう話はナシでお願いしますね。

-- 
なかむら




armadillo メーリングリストの案内