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/>