[Anthy-dev 3652] Re: 9100e のバグ報告およびその修正パッチ

Back to archive index

g-hal****@fenix***** g-hal****@fenix*****
2008年 12月 15日 (月) 22:10:43 JST


 fenix.ne.jp の G-HAL です。
先に送りましたパッチに書き忘れが1件ありました。
また、先に送りました後に、別の1件のメモリ破壊バグを見つけました。
都合2件分の追加の修正パッチを送付致します。



・ OCHAIRE に特定の学習がある状態で、特定の変換を行うと、
   不正なメモリ読み出しが行われる。

→ src-worddic/record.c の trie_find_longest() にて
   条件に該当する項目が見つからない時に、
   もし条件に該当する項目があると仮定した場合の、
   想定される位置の次?の項目が返される事がある模様。


発症例:
次の2件の学習だけがある状態で、「あ」を変換すると、発生する。
ADD "OCHAIRE" S"あああ" N1 N3 S"あ" 
ADD "OCHAIRE" S"ああい" N1 N3 S"あ" 

発症しうる最も単純な状況を追求した結果、この様な物だった為、
「OCHAIRE に1文節の学習はしない」、「その読みでその変換はしない」、
と言う突っ込みは無しでお願いします。

OCHAIRE 学習されている内容の読みが2文字だと、
アーキテクチャや OS、設定などによっては、問題を検出できません。
また、アーキテクチャや OS、設定などによっては、
OCHAIRE 学習されている内容の読みを5文字なり9文字なりなどにしないと、
問題を検出できないかもしれません。



・ anthy-agent にて、メモリ破壊を起こす事が有る。
→ src-util/input.c にて、free() した後のメモリに書き込みを行っている。


----------------------------------------------------------------
diff -uprN anthy-9100e.debug/src-util/input.c anthy-9100e.debug2/src-util/input.c
--- anthy-9100e.debug/src-util/input.c	2008-12-05 00:00:00.000000000 +0900
+++ anthy-9100e.debug2/src-util/input.c	2008-12-11 00:00:00.000000000 +0900
@@ -566,12 +566,14 @@ cmd_resize(struct anthy_input_context* i
   }
   ictx->last_gotten_cand = NTH_UNCONVERTED_CANDIDATE;
 
-  for (as = as->next; as; ) {
-    struct a_segment* next;
-    next = as->next;
+  as = as->next;            /* メモリ破壊の修正 */
+  if (as) {
     as->prev->next = NULL;
-    free(as);
-    as = next;
+    for (; as; ) {
+      struct a_segment* const next = as->next;
+      free(as);
+      as = next;
+    }
   }
 }
 
diff -uprN anthy-9100e.debug/src-worddic/record.c anthy-9100e.debug2/src-worddic/record.c
--- anthy-9100e.debug/src-worddic/record.c	2008-12-05 00:00:00.000000000 +0900
+++ anthy-9100e.debug2/src-worddic/record.c	2008-12-11 00:00:00.000000000 +0900
@@ -743,7 +743,7 @@ do_select_longest_row(struct record_sect
 
   mark = trie_find_longest(&rsc->cols, name);
   xs.str = name->str;
-  for (i = mark->row.key.len; i > 1; i--) {
+  for (i = (mark->row.key.len <= name->len) ? mark->row.key.len : name->len; i > 1; i--) {  /* 不正なメモリアクセスの修正 */
     /* ルートノードは i == 1 でマッチするので除外
      * trie_key_nth_bit 参照
      */
----------------------------------------------------------------

================================================================
                         (Now Printing)                         
================================================================



Anthy-dev メーリングリストの案内
Back to archive index