[Anthy-dev 739] uim_init and uim_quit

アーカイブの一覧に戻る

Seiichi SATO ssato****@sh*****
2004年 4月 7日 (水) 22:11:23 JST


はじめまして、佐藤精一と申します。

X で動く多言語端末エミュレータ mlterm を uim に対応させようと
しているのですが、uim_quit を呼んだ後に uim_init を呼ぶと落ちる
という問題に出くわしました。そういう仕様なのかなと思ったのですが
徳永さんに、落ちるとしたらバグだと教えてもらったので
少し追いかけてみました。

落ちる箇所として確認できたのは以下の2点です。

1. 一度 anthy の初期化が成功すると anthy.scm の anthy-init-lib-ok
   が真のままになり、init_anthy_lib が 2度と呼ばれないため
   すでに dlclose されていても dlopen しないで libanthy.so のシンボル
   (api.release_context など)が参照されてしまう場合がある。

2. skk-dic.c の uim_quit_skk_dic で skk_dic を開放した後、再度
   uim_quit_skk_dic が呼ばれると開放済みの skk_dic に触ってしまい
   落ちる。

手元では添付のパッチで落ちなくなりました。

-- 
Seiichi

-------------- next part --------------
diff -uNr uim-0.3.4.2.orig/scm/anthy.scm uim-0.3.4.2/scm/anthy.scm
--- uim-0.3.4.2.orig/scm/anthy.scm	2004-04-07 12:57:34.000000000 +0900
+++ uim-0.3.4.2/scm/anthy.scm	2004-04-07 21:02:28.000000000 +0900
@@ -190,10 +190,8 @@
    (let ((c '())
 	 (rkc (rk-context-new ja-rk-rule #t #f)))
      (set! c (copy-list '(() () () () () () () () () () () 0 #t #f)))
-     (if (and
-	  (not anthy-init-lib-ok?)
-	  (symbol-bound? 'anthy-lib-init))
-	 (set! anthy-init-lib-ok? (anthy-lib-init)))
+     (if (symbol-bound? 'anthy-lib-init))
+	 (set! anthy-init-lib-ok? (anthy-lib-init))
      (anthy-context-set-ac-id!
       c
       (if anthy-init-lib-ok?
diff -uNr uim-0.3.4.2.orig/uim/anthy.c uim-0.3.4.2/uim/anthy.c
--- uim-0.3.4.2.orig/uim/anthy.c	2004-04-05 03:54:19.000000000 +0900
+++ uim-0.3.4.2/uim/anthy.c	2004-04-07 20:58:13.000000000 +0900
@@ -285,11 +285,13 @@
 {
   int i;
 
-  if (context_slot) {
-    for (i = 0; i < MAX_CONTEXT; i++) {
-      if(context_slot[i].ac) {
-	api.release_context(context_slot[i].ac);
-      }
+  if (!context_slot) {
+    return;
+  }
+
+  for (i = 0; i < MAX_CONTEXT; i++) {
+    if(context_slot[i].ac) {
+      api.release_context(context_slot[i].ac);
     }
   }
 
diff -uNr uim-0.3.4.2.orig/uim/skk-dic.c uim-0.3.4.2/uim/skk-dic.c
--- uim-0.3.4.2.orig/uim/skk-dic.c	2004-04-03 02:41:31.000000000 +0900
+++ uim-0.3.4.2/uim/skk-dic.c	2004-04-07 20:59:03.000000000 +0900
@@ -883,4 +883,5 @@
     free_skk_line(tmp);
   }
   free(skk_dic);
+  skk_dic = NULL;
 }


Anthy-dev メーリングリストの案内
アーカイブの一覧に戻る