このページは過去に掲載していたものをそのまま使用しています。

[ Home | Index ]

XIMに関連したSEGVへの対応

池田さんという方から、XIMに関係してSEGVして しまうという問題点と解決法のメールを頂きました。ここで紹介して パッチをdia-0.84-7-8.diffとして 公開する事にします。

メール

問題点の指摘と対処方法を富士インフォックス・ネット(株)システム開発部の 池田さんがメールで連絡してくれました。以下のページでメールの内容をほぼ全部 引用する形でレポートを紹介しています。 [ 池田さんのメールを元にしたページ ]

障害の概要

池田さんのメールによると (詳くは前出の別ページを見てください)

  canvas を開く際、 XIC が初期化されないまま gdk_im_begin() に渡されたため、
  SEGV が発生した。
とのことでした。この原因はXIC(GdkIC)の初期化前にgdk_im_begin()が呼ばれる点に あったようです。

解決方法

原因がGdkICの初期化にあったので、解決するにはこの初期化をする場所を 適切なものに変更すれば良いようです。そこで初期化のコードの位置を create_display_shell()関数の前に移動しました。

もう一つの改善点

個人的にはこちらの方がうれしかったのですが、池田さんが今回の障害とは 直接関係なかったのですがgdk_im_end()を組込んでくれました。

 /* in disp_callback.c */
    case GDK_FOCUS_CHANGE:
#ifdef USE_XIM
        if(((GdkEventFocus *)event)->in) {
                if(ddisp->ic == NULL)
                create_input_dialog (ddisp);
                else
                gdk_im_begin(ddisp->ic, ddisp->canvas->window);
        } else {
                gdk_im_end();
        }
#endif

障害が再現する場合には御一報を

実際のところ私の環境では、具体的な障害の例を見ることができなかった のですが、どなたか「私のこの環境では落ちた」などの障害に遭遇したら、状況と 環境を書いた簡単なメールをください。今回の変更の影響の範囲を知りたいので よろしくお願いします。


Yasuhiro Abe <m5031201@u-aizu.ac.jp>
Last modified: Sat Aug 26 12:19:27 JST 2000