[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 メーリングリストの案内