plain-search.dpatch by KIHARA Hideto <deton@m1.interq.or.jp>

Fix end condition in binary search algorithm for plain dictionaries (#209217).

Received: from [146.82.138.7] (helo=master.debian.org) by nu.ike.tottori-u.ac.jp with esmtp (Exim 3.36 #1 (Debian)) for ml@kawamura.net id 19ut2u-0001MC-00; Thu, 04 Sep 2003 21:17:04 +0900
Received: from a15-c1.data-hotel.net [203.174.65.19]  by master.debian.org with smtp (Exim 3.35 1 (Debian)) id 19ut2q-0000vR-00; Thu, 04 Sep 2003 07:17:00 -0500
Received: (qmail 71944 invoked by alias); 4 Sep 2003 21:16:44 +0900
Mailing-List: contact skk-help@ring.gr.jp; run by ezmlm
Precedence: bulk
X-No-Archive: yes
List-Post: <mailto:skk@ring.gr.jp>
Reply-To: skk@ring.gr.jp
List-Help: <mailto:skk-help@ring.gr.jp>
List-Unsubscribe: <mailto:skk-unsubscribe@ring.gr.jp>
List-Subscribe: <mailto:skk-subscribe@ring.gr.jp>
Delivered-To: mailing list skk@ring.gr.jp
Received: (qmail 71354 invoked from network); 4 Sep 2003 21:15:58 +0900
Date: Thu, 4 Sep 2003 21:16:41 +0900
From: KIHARA Hideto <deton@m1.interq.or.jp>
To: skk@ring.gr.jp
Message-ID: <20030904121641.GA2684@m1.interq.or.jp>
Mime-Version: 1.0
User-Agent: Mutt/1.4.1i-ja.1
Subject: [skk 5028] patch for skksearch
X-Bogosity: No, tests=bogofilter, spamicity=0.000004, version=0.14.4
X-UIDL: ''7"!Le8!!?#@!!?06"!
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit

skksearch-0.0用のパッチです。
配布元のページはもう無くなってしまったようですが、
Debianのパッケージに入っていて、
はまってる人をたまに見かけるので、SKK MLにも流しておきます。
# 2ちゃんねるの方には2月ごろに流したんですが。

* 現象
「あg」のような読みを検索するとskksearchが暴走してCPUを食いつぶす。

* 発生条件
okuri-ari entriesが空のplain辞書(SKK-JISYO.JIS2等)が
検索対象辞書に含まれるときに、
「あg」のようにokuri-nasi entriesよりも辞書順で小さい読みを検索すると、
無限ループにはまる。

CDB形式の辞書の場合は発生しない。

* 原因
okuri-ari entriesが空の場合に、ファイル中の位置が
okuri-ari entriesの終了位置より後になるが、
==で比較しているためループを抜けない。

* パッチ
==を>=に変更。

Index: skksearch-0.0/dic_plain.c
===================================================================
--- skksearch-0.0.orig/dic_plain.c	Fri Dec 15 18:06:06 2000
+++ skksearch-0.0/dic_plain.c	Sat Feb 22 23:04:10 2003
@@ -118,7 +118,7 @@
   while (1) {
     fseek(fp, (end + begin) / 2, SEEK_SET); /* center */
     fgets(buf, DIC_BUFSIZE, fp); /* Skip */
-    if ((half = ftell(fp)) == end) {
+    if ((half = ftell(fp)) >= end) {
       break;			/* goto linear search */
     }
     fgets(buf, DIC_BUFSIZE, fp);
