このページは過去に掲載していたものをそのまま使用しています。
富士インフォックス・ネット(株)システム開発部の池田さんが 送ってくださったXIMに関連したSEGVに対処するパッチです。
以下に池田さんが送ってくださったメールの一部をそのまま載せます。
[ 現象 ]
dia-0.84-7 で
ファイル → 新規ダイアグラム
ファイル → 開く
コマンドラインからファイル名を指定して実行
のいずれかの操作を行うと canvas を開いた時点で SEGV を起こす
[ 環境 ]
Kondara MNU/Linux 1.1 (i686)
Gnome desktop
gdk、gtk+ については次の2 つのバージョンで現象が再現した
glib-1.2.6-0.1k1 + gtk+-1.2.6-1k6 (Kondara 1.1 デフォルト)
glib-1.2.8-1k1 + gtk+-1.2.8-1k1 (upgrade)
[ 原因 ]
canvas を開く際、 XIC が初期化されないまま gdk_im_begin() に渡されたため、
SEGV が発生した。
canvas を開く際の処理の流れ
display.c:new_display()
1. ddisp 構造体を動的確保、初期化
2. create_display_shell()
→ GDK_FOCUS_CHANGE イベント発生
ddisplay_canvas_event() が call される
disp_callbacks.c:ddisplay_canvas_event()
3. ddisplay->ic が NULL なら create_input_dialog() を call
NULL でなければ gdk_im_begin() を call
canvas を開くときなどは create_input_dialog() を call したいので
ddisplay->ic == NULL
でなければならないが、create_display_shell() を call する前(1.)の段階で
ddisp->ic が初期化されていなかった。
そのため 3. で無効な XIC が gdk_im_begin() に渡され SEGV を生じた。
[ 対処 ]
create_display_shell() を呼ぶ前に ddisp->ic, ddisp->ic_attr を NULL で
初期化するようにした。
なお、focus out の際に gdk_im_end() を呼ぶようにもした。これは本現象と
は無関係であると思われるが、GDK Reference Manual に従い念のため入れた。
[ 結果 ]
修正後、10日間使用したが、現象は再現せず、問題なく使用できた。
[ パッチ ]
適用方法
dia-0.84 オリジナル版に dia-0.84-0-1.diff、dia-0.84-1-6.diff、
dia-0.84-6-7.diff を当てた後、さらに以下のパッチを当てる
池田さんがdia-0.84-7を修正するパッチを送ってくださいました。 あらかじめ以下の差分の内容をファイル(filename)に保存しておき 、dia-0.84-7のディレクトリで patch -p1 < filenameのような感じで使ってください。
diff -uNr dia-0.84-7/app/disp_callbacks.c dia-0.84-7+2/app/disp_callbacks.c
--- dia-0.84-7/app/disp_callbacks.c Tue Jul 11 20:44:23 2000
+++ dia-0.84-7+2/app/disp_callbacks.c Sat Jul 22 13:10:52 2000
@@ -293,10 +293,14 @@
case GDK_FOCUS_CHANGE:
#ifdef USE_XIM
- if(ddisp->ic == NULL)
- create_input_dialog (ddisp);
- else
- gdk_im_begin(ddisp->ic, ddisp->canvas->window);
+ 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
diagram_update_menu_sensitivity(ddisp->diagram);
break;
diff -uNr dia-0.84-7/app/display.c dia-0.84-7+2/app/display.c
--- dia-0.84-7/app/display.c Tue Jul 11 20:44:14 2000
+++ dia-0.84-7+2/app/display.c Sat Jul 22 13:10:23 2000
@@ -137,6 +137,11 @@
ddisp->visible.right = prefs.new_view.width/ddisp->zoom_factor;
ddisp->visible.bottom = prefs.new_view.height/ddisp->zoom_factor;
+#ifdef USE_XIM
+ ddisp->ic = NULL;
+ ddisp->ic_attr = NULL;
+#endif
+
create_display_shell(ddisp, prefs.new_view.width, prefs.new_view.height,
filename);
@@ -153,10 +158,6 @@
g_hash_table_insert (display_ht, ddisp->shell, ddisp);
g_hash_table_insert (display_ht, ddisp->canvas, ddisp);
-#ifdef USE_XIM
- ddisp->ic = NULL;
- ddisp->ic_attr = NULL;
-#endif
return ddisp; /* set the user data */
}