[Namazu-users-ja 815] Re: [Namazu-devel-ja 1160] 一部の検索式処理の問題
Tadamasa Teranishi
yw3t-trns @ asahi-net.or.jp
2006年 8月 13日 (日) 01:40:31 JST
寺西です。
# namazu-users-ja に変更します。
Kenichi Maehashi wrote:
>
> CGI 利用時(コマンドライン上では試していません)、Query に
> 「"」(半角ダブルクオート (%22) )を渡すと、「processing
> time exceeds a limit: 15」と表示され、タイムアウトしてしま
調べたところインデックスに単語として「"」が含まれる場合(つまり、
ヒットする場合)で、HTML 出力の場合、無限ループに入ることが分かり
ました。
同様に 「/」でも発生します。
修正パッチを添付します。
インデックスにこれらが単語として含まれない場合(ヒットしない場合)には
無限ループにはなりません。
このため、インデックスから 「"」「/」を削除しても回避できます。
次期 Namazu 2.0.17 では修正します。
> います。SUICIDE_TIME Directive を取り除いても発生しました。
SUICIDE_TIME を未設定の場合はデフォルトの60秒となります。取り除いた
からといって無制限になるわけではありません。
> また、Query に %20 を渡すと、「エラー! 不正な検索式です」
> と表示されるのですが、これは正常な動作なのでしょうか。
空白のみは検索式では有効な文字列がないので、不正な検索式とみなして
います。つまり、これは正しい動作です。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E
-------------- next part --------------
--- result.c.org 2005-07-21 17:47:55.000000000 +0900
+++ result.c 2006-08-13 01:28:56.000000000 +0900
@@ -284,7 +284,7 @@ emphasize(char *str)
continue;
}
- if (strlen(key) > 0) {
+ if (strlen(key) >= 2) {
if ((key[0] == '"' && key[strlen(key) - 1] == '"')
|| (key[0] == '{' && key[strlen(key) - 1] == '}')
|| (key[0] == '/' && key[strlen(key) - 1] == '/')) {
@@ -295,20 +295,22 @@ emphasize(char *str)
keylen = strlen(key);
- do {
- ptr = my_strcasestr(ptr, key);
- if (ptr != NULL) {
- if ((ptr == str || is_wordboundary(ptr - 1))
- && keylen && is_wordboundary(ptr + keylen - 1)){
- memmove(ptr + 2, ptr, strlen(ptr) + 1);
- memmove(ptr + 1, ptr + 2, keylen);
- *ptr = EM_START_MARK;
- *(ptr + keylen + 1) = EM_END_MARK;
- ptr += 2;
- }
- ptr += keylen;
- }
- } while (ptr != NULL);
+ if (keylen > 0) {
+ do {
+ ptr = my_strcasestr(ptr, key);
+ if (ptr != NULL) {
+ if ((ptr == str || is_wordboundary(ptr - 1))
+ && keylen && is_wordboundary(ptr + keylen - 1)){
+ memmove(ptr + 2, ptr, strlen(ptr) + 1);
+ memmove(ptr + 1, ptr + 2, keylen);
+ *ptr = EM_START_MARK;
+ *(ptr + keylen + 1) = EM_END_MARK;
+ ptr += 2;
+ }
+ ptr += keylen;
+ }
+ } while (ptr != NULL);
+ }
}
}
Namazu-users-ja メーリングリストの案内