Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Solaris's strcasecmp
At Sun, 24 Feb 2002 21:36:08 +0900,
SATOH Fumiyasu wrote:
> Namazu でも、Solaris の strcasecmp(3C) の問題に遭遇していません
> でしたっけ? ご参考までに、Postfix 1.1.4 の HISTORY ファイルより:
2000/5/25 の
Subject: [namazu-users-ja] namazu.cgi の出力でキーワード以外が強調表示
というスレッドが、この問題に関連してるみたいですね。
> 20020222
>
> Workaround: Solaris bug 4380626: strcasecmp() and strncasecmp()
> produce incorrect results with 8-bit characters. For example,
> non-ASCII characters could compare equal to ASCII characters,
> and that could result in any number of security problems.
> Files: util/strcasecmp.c, COPYRIGHT (the BSD license).
>
> 記憶違いだったらすみません。
Solaris の strcasecmp() の内部では 256 個の要素を持った配列を使って
大文字・小文字を無視した比較しているのですが、0 〜 255 のインデックス
で配列にアクセスすべきところ、char と unsigned char を取り違えているら
しく、8bit の文字が渡ってきた場合にマイナスの値のインデックスで配列に
アクセスしてしまっているようなんです。符号拡張で、8bit の char は負の
整数値になりますから。つまり、8bit のことを考えてコーディングしたけど、
それが正しく動作せず、しかも異常動作を引き起こしている。
なので、8bit 文字が含まれていると配列の外にアクセスしてしまい、
strcasecmp() の返り値が整合性のとれないものになります(*1)。
そのために qsort() が発狂して qsort から呼び出される比較関数に変な領域
へのポインタが渡ることがあります。で、postfix が死にます。
*1 … 文字列 A < 文字列 B、文字列 B < 文字列 C なのに
文字列 C < 文字列 A としてしまうことがある
KUSANO Takayuki <URL:http://www.asahi-net.or.jp/~AE5T-KSN/>