[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00249] Re: FDclone 2.05a has been released
- Subject: [FDclone-users:00249] Re: FDclone 2.05a has been released
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 10 Dec 2003 01:57:18 +0900
しらいです。
In Message-Id <20031209163505.1B86B53DCB@yuka.unixusers.net>
Takashi SHIRAI <shirai@unixusers.net>writes:
> しらいです。
今回は一点のみの変更点ですが一応解説しておきます。
> 組込みコマンド checkid の出力が間違っていた点を修正。
checkid は MD5 値を計算する組込みコマンドですが、間違って
いたのはその計算ではなく出力部分でした。
で、これだけのミスで急いで修正版を出した理由ですが、一つに
は MD5 という security 的に重要な要素に関わる支障で影響が大
きいこと、もう一つには、その原因の一旦が printf() ルーチンと
いう結構 primitive な部分にあったことが挙げられます。
FDclone はこれまでにも幾つもの library 関数を再実装してき
ているのですが、printf() を再実装した理由は、asprintf() を未
実装の環境が多いことと、「%s」の展開に独自拡張を加えたかった
ことに起因します。
特に UNIX 版では複数の漢字コード間の convert を行なってい
ますので、この機能を printf() の中に埋め込んでしまえば、呼出
し側から漢字コードを意識することなく ASCII 文字列と同列で扱
うことが可能になります。
今回のミスはその文字列部分には関係なかったのですが、数値引
数を受ける際の型の拡張がうまくいっていなかったことが原因でし
た。
例えば -1 の二の補数表現は 16bits 幅で 0xffff、32bits 幅で
0xffffffff になります。int16_t 型の -1 を int32_t 型に代入す
る際には、負号拡張されて上位 16bits が 1 で埋められます。
ところが、同じ 0xffff という数値は u_int16_t 型では 65535
を表し、これを u_int32_t 型に代入する際には負号拡張してはい
けません。
一般には、変数の型はその変数定義により定められているのです
が、printf() の引数の場合は format 文字列によってのみ定めら
れます。なので、仮に int 型の引数を渡したとしても、"%u" とい
う format 文字列が書かれていれば、それは u_int 型で処理しな
くてはなりません。
FDclone 2.05 での実装では、全て signed で処理してしまって
いたため、"%u" や "%x" 指定の箇所でも MSB の立った数値が負号
拡張されてしまっていました。このため、"0x80000000" と表示し
なくてはならないところが "0xffffffff80000000" などと表示され
ることがあった訳です。
実際、このミスの適用されるケースは現行の FDclone の実装で
は殆んど存在しないので、checkid 以外での支障は多分皆無だと思
うのですが、primitive な部分だけに慎重に対処しました。
しらい たかし