[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00910] Re: atod SEGV



青野です。こんばんは。

とりあえず原因らしきものが見つかりましたのでご報告します。

<020901033014.M0117382@XXXX>の記事において
青野は書きました。

>> <1030505588.30747.47.camel@Remba>の記事において
>> zic-fw@XXXXさんは書きました。
>> 
>> >> 単純に、読みの長さが問題という気もして来ました。
>> >> 添付ファイルで、私の環境では確実に SEGV となります。
>> >> 
>> >> 読みを9文字以内にすると、OKに見えます。
>> 
>> 問題の関数はLittle Endianなアーキテクチャ(x86など)でしか呼
>> ばれないのでsparc-sun-solaris2.4な環境では再現しませんでし
>> た。

問題はrev_ud_hontai()にあった模様です。ここで参照している
hostart(から始まるバイト列)は元々ujistoud() (in atod.c)で
代入されているのですが、歴史的(?)理由により始めの4バイトは
(intで) 0が代入されています。そのためrev_ud_hontai()でもそ
の慣習に合わせるようにしました。
#なぜそのようなことをしているのかは…どなたか教えてください(^^;

>> 恐らくLittle Endianなら他のOSでも再
>> 現できると思われますが、そこまでは確認できてません。

FreeBSD-4.3(x86)ではクラッシュせずに終わりましたが、たまた
ま大丈夫だっただけのように見えます。出力された辞書をodでみ
る限り、パッチを当てたatodによるものと異なるようなので、実
際に辞書が使えないかもしれません。
#これも誰か確かめてみてください(^^;;;。

(.signatureの)後にCVSソース向けのパッチを付けておきます。
atodのUsageも書き換えましたのでご賞味ください。問題がなけ
ればcommitします。
#RedHatのSRPMから構築する際はrevdic.cのところだけでも適用
#してください。

ちなみに「登録可能形式辞書」の英訳はボンドさんによる
atod.man(英訳)を参考にしました。
----
青野智樹	(aono@XXXX)

(以下パッチ)
Index: Wnn/etc/revdic.c
===================================================================
RCS file: /cvs/freewnn/FreeWnn/Wnn/etc/revdic.c,v
retrieving revision 1.3
diff -u -r1.3 revdic.c
--- Wnn/etc/revdic.c	14 Jun 2001 18:15:55 -0000	1.3
+++ Wnn/etc/revdic.c	5 Sep 2002 09:53:43 -0000
@@ -80,7 +80,7 @@
   int k;
   int len;
 
-  for (hop = (struct uind2 *) hostart; (UCHAR *) hop < hoend;)
+  for (hop = (struct uind2 *)((int *) hostart + 1); (UCHAR *) hop < hoend;)
     {
       rev_int (&(hop->next));
       rev_int (&(hop->serial));
Index: Wnn/jutil/atod.c
===================================================================
RCS file: /cvs/freewnn/FreeWnn/Wnn/jutil/atod.c,v
retrieving revision 1.10
diff -u -r1.10 atod.c
--- Wnn/jutil/atod.c	14 Jul 2002 04:26:57 -0000	1.10
+++ Wnn/jutil/atod.c	5 Sep 2002 09:53:43 -0000
@@ -520,11 +520,12 @@
 static void
 usage ()
 {
-  fprintf (stderr, "Usage : %s [-r -R -S -e -s maximum word count(default %d) -P passwd (or -N) -p hindo_passwd (or -n) -h hinsi_file_name] <dictonary filename>\n", com_name, MAX_ENTRIES);
+  fprintf (stderr, "Usage : %s [-r -R -S -U -e -s maximum word count(default %d) -P passwd (or -N) -p hindo_passwd (or -n) -h hinsi_file_name] <dictonary filename>\n", com_name, MAX_ENTRIES);
   fprintf (stderr, "Input the ascii dictionary from stdin\n");
   fprintf (stderr, "-r is for creating dictionary with normal and reverse index\n");
-  fprintf (stderr, "-R is for creating reverse dictionary\n");
-  fprintf (stderr, "-S is for creating static  dictionary.\n");
+  fprintf (stderr, "-R is for creating reverse (implies updatable) dictionary. (default)\n");
+  fprintf (stderr, "-S is for creating static    dictionary.\n");
+  fprintf (stderr, "-U is for creating updatable dictionary.\n");
   fprintf (stderr, "-e is for compacting kanji string.\n");
   exit1 ();
 }