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; }