Last modified: Thu Dec 30 21:10:54 1999 +0900 (JST)
FreeBSD の 2000 年問題については http://www.jp.freebsd.org/www.FreeBSD.org/ja/y2kbug.html に記載されています。 しばらく前にみたときは、ここには何もなかったような気がするのですが、ひさしぶりに見なおすとまあいろいろ書いてあるではありませんか。 特に、2.2.8-RELEASE に間にあっていないものもいくつかあるようで、2.2.x ユーザは注意が必要です。 さらには、3.3-RELEASE にも 2 つ問題が残っていますし、 3.4-RELEASE にも 1 つ問題が残っています。
ここでは原則として 2.2.8 について見ていきますが、3.[34]-RELEASE についても註釈を入れます。
ここでは OS 領域だけを取りあつかいます。
対象は次のファイル:
……ですが、これ、2.2.8 ではすでに fix されているように見えます。 http://www.jp.freebsd.org/www.FreeBSD.org/ja/y2kbug.html の記述内容 (FreeBSD-3.1 以降で修正済) に問題があります。
他の OS で GNU groff を使っているところは、同様の修正が必要のはず。
src/usr.bin/touch/touch.c です。RELENG_2_2 では 1.4.2.5 版が最新。
うるう年の計算をまちがえるってやつですね。 RELENG_2_2 最新は 1.4.2.1 版。 2.2.8-RELEASE は 1.4 版。
他 OS で xntp 3.4e を使っている場合は同様の問題あり。 でも DCF77 を使ってない人 (ふつうはこれのはず) には関係ない。
GNU tar 1.11.2 の getdate.y の修正。 RELENG_2_2 最新は 1.2.8.3 版。
おおもとの GNU tar は、1.12 以降は
XPG4 の y2k soltion (XPG4 suggests that years 00-68 map to
2000-2068, and
years 69-99 map to 1969-1999
) が実装されている。
他 OS で GNU tar 1.11.x をインストールしている場合は、すみやかに
1.13 に upgrade しよう。
RELENG_2_2 最新の 1.4.2.10 でも y2k fix は入っていないみたい。 3.1-RELEASE 以降の fetch は fix されているので、3.1-RELEASE 以降の usr.bin/fetch/ 以下をごそっともってきて fetch をつくりなおしたほうが早い。
N/A?
RELENG_2_2 じゃないけど、 1.1.1.4.1 版が 2.2.8-RELEASE でも使えるはず。
他の OS で GNU groff を使っているところは、同様の修正が必要のはず。
2.x では関係ない。
usr.sbin/adduser/adduser.perl の RELENG_2_2 最新版 1.19.2.12 で ok。
usr.sbin/cron/lib/misc.c の RELENG_2_2 最新版 1.3.6.3 で ok。
usr.sbin/tcpdump/tcpslice/tcpslice.c の 1.8 と 1.9 に y2k 関連 fix が含まれている。 RELENG_2_2 最新版 1.3.2.2 版 にはこれが含まれていない。
3.3-RELEASE でも該当 (3.4-RELEASE では fix)。
date コマンドに問題 (というか、これまでそれが仕様だった)。 yyyymmddHHMM.ss 形式での時刻設定に失敗する (年が 4 桁だとうまくいかない)。 RELENG_2_2 最新版 には変更が含まれていない。 3.4-RELEASE に含まれる 1.26.2.4 版では fix されている。 ざっと diff を見た限りでは、2.2.8 で 1.26.2.4 版を使っても問題ないように見える。
3.[34]-RELEASE でも該当。
chpass コマンドに問題。chpass "-e Dec 6 00" username のように、-e の引数の最後に 00 を指定するとエラーになってしまう。 99 や 01 では問題ない。また、2000 と指定すれば問題ない。
misc/14511 の Audit-Trail に記述されている patch を、 RELENG_2_2 最新版 1.5.2.1 および 3.[34]-RELEASE 版 1.7.2.1 に適用すればいい……はず。
なお、2.2.8-RELEASE の chpass には -e オプションはないが、 -a オプションで password field 全体を指定した場合に同じ問題が発生するはずなので、やはり修正が必要なはずだ。
以上を手作業でやってるとたいへんなので、まとめてみました。 無保証です。at your own risk でおつかいください。
2.2.8-y2k.tar.gz を入手する。
どこかに展開する。
y2k というディレクトリができるので cd する。
fixy2k.sh を root 権限で実行する。
注意: fixy2k.sh はバックアップファイルをつくりませんので、 必要であれば fixy2k.sh をいじくって、つくるようにしてやってください。
RELENG_2_2 でやってる人は、最新の RELENG_2_2 にした上で fetch, bin/9502 (input.cc), bin/9507 (tcpslice.c), bin/14472 (date), misc/14511 (chpass) を対応すればいいです。2.2.8-y2k.tar.gz には (たまたまそこにあった) 3.2-RELEASE の fetch を入れてあります。 また、bin/9507 用の tcpslice.c.diff も入っています。
3.[34]-RELEASE の人は、2.2.8-y2k.tar.gz のかわりに 3.3-y2k.tar.gz を get して、上記と同様に実行してください。
fixy2k.sh において、fetch を usr.sbin として扱っているバグがありました。 正しくは usr.bin です。fix しました。修正前のアーカイブ:
MD5 (2.2.8-y2k.tar.gz) = c42353d3e882851a538695c367c88497
修正後のアーカイブ:
MD5 (2.2.8-y2k.tar.gz) = d5ddabd5203f49ca9fa2ddcb6ea3a6fd
すでに前のバージョンで「やっちまった」人は root になって以下のようにすれば ok です。
# mv /usr/sbin/fetch /usr/bin/fetch # rm -rf /usr/src/usr.bin/fetch/ # mv /usr/src/usr.sbin/fetch/ /usr/src/usr.bin/
村越さん、ご指摘ありがとうございます。_o_
MD5 (2.2.8-y2k.tar.gz) = 5889f6f6693971c6785c8b5003e852e3
すでに前のバージョンで「やっちまった」人は、新しいものを再実行するか、2.2.8-y2k.tar.gz に含まれている tcpslice.c.diff を /usr/src/usr.sbin/tcpdump/tcpslice/tcpslice.c に適用して cd /usr/src/usr.sbin/tcpdump/tcpslice/; make; make install すれば ok です。
岡@松下情報システムさん、ご指摘ありがとうございました。
y2k fix 項目がまた 2 つ増えている。 おまけに date と chpass という、比較的利用頻度が高いコマンドだ。 これらはもちろん 3.3-RELEASE には間にあっていないので、3.3-RELEASE ユーザも対象となる。chpass は 3.4-RELEASE にすら間にあっていない。
というわけで、またまたアーカイブをつくりなおしました。 また 3.[34]-RELEASE 用もつくりました。
MD5 (2.2.8-y2k.tar.gz) = 6b010e939f695539620550526d27b7c4 MD5 (3.3-y2k.tar.gz) = c14a2664463f2958333de668f050e73d
永井@電気通信大学さん情報ありがとうございました。
bin/14472 は年が 4 桁の場合に失敗するという話であった。 記述を修正した (patch 自体はそのまま)。 坂内さんご指摘ありがとうございました。
2.2.8-RELEASE の chpass には -e オプションはないとのフォローをいただいた。 -e についてはそのとおりだが、でもやっぱり修正は必要だと思う。 これに関する記述を追加した。 佐藤隆幸さんご指摘ありがとうございます。