Ticket #34601

FreeBSD/amd64 で USE_XPM を有効にすると墓石表示時に segmentation fault

Open Date: 2014-11-13 22:23 Last Update: 2016-02-15 20:41

Reporter:
Owner:
(None)
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

JNetHack-3.4.3-0.11 を FreeBSD/amd64 9.1-RELEASE でプレイしています。

これは FreeBSD ports コレクションに入っている ja-nethack-3.4.3_6 ですが、include/config.h で "# define USE_XPM" を手動で有効にして使っています。


X11 版でプレイヤー死亡後、最後に墓石 (rip.xbm) を表示するタイミングで segmentation fault が起きます。

Program received signal SIGSEGV, Segmentation fault.
0x00000008017f52c0 in XmbTextEscapement () from /usr/local/lib/libX11.so.6
(gdb) where
#0  0x00000008017f52c0 in XmbTextEscapement () from /usr/local/lib/libX11.so.6
#1  0x00000000005bb18c in rip_exposed (w=0x8031f5200, client_data=0x0,
    widget_data=0x7fffffffc580) at ../win/X11/wintext.c:681
#2  0x000000080154b048 in XtCallCallbacks () from /usr/local/lib/libXt.so.6
#3  0x00000000005a9556 in Redisplay (w=0x8031f5200, event=0x7fffffffc580,
    region=0x80306d140) at ../win/X11/Window.c:127
#4  0x00000008015583f5 in SendExposureEvent () from /usr/local/lib/libXt.so.6  
#5  0x0000000801558952 in XtDispatchEventToWidget ()  
   from /usr/local/lib/libXt.so.6  
#6  0x0000000801558e4c in _XtDefaultDispatcher ()  
   from /usr/local/lib/libXt.so.6  
#7  0x00000008015580b8 in XtDispatchEvent () from /usr/local/lib/libXt.so.6  
#8  0x00000000005b1622 in x_event (exit_condition=2)  
    at ../win/X11/winmap.c:1842  
#9  0x00000000005ba2ed in display_text_window (wp=0x86dfe0, blocking=1 '\001')  
    at ../win/X11/wintext.c:270  
#10 0x00000000005ab708 in X11_display_nhwindow (window=4, blocking=1 '\001')  
    at ../win/X11/winX.c:801  
#11 0x000000000046b9f3 in done (how=0) at end.c:1151  
#12 0x0000000000469acb in done_in_by (mtmp=0x80322c9c0) at end.c:317  
#13 0x00000000004ade78 in mdamageu (mtmp=0x80322c9c0, n=3) at mhitu.c:2740  
#14 0x00000000004ab2d2 in hitmu (mtmp=0x80322c9c0, mattk=0x82a310)  
    at mhitu.c:2134  
#15 0x00000000004a71fe in mattacku (mtmp=0x80322c9c0) at mhitu.c:807  
#16 0x00000000004d0159 in dochug (mtmp=0x80322c9c0) at monmove.c:614  
#17 0x00000000004cdde6 in dochugw (mtmp=0x80322c9c0) at monmove.c:110  
#18 0x00000000004c2de4 in movemon () at mon.c:692  
#19 0x0000000000404cba in moveloop () at allmain.c:94  
#20 0x000000000059f36d in main (argc=1, argv=0x7fffffffd2c0)  
    at ../sys/unix/unixmain.c:321  
(gdb) up  
#1  0x00000000005bb18c in rip_exposed (w=0x8031f5200, client_data=0x0,  
    widget_data=0x7fffffffc580) at ../win/X11/wintext.c:681  
681             int width = XmbTextEscapement(fontset, rip_line[i], len);  
(gdb) print width  
$1 = 8  
(gdb) print len  
$2 = 4  
(gdb) print fontset
$3 = 0x308cc00
(gdb) print rip_line[i]
$4 = "nabe", '\0' <repeats 12 times>
(gdb) print rip_line
$5 = {"nabe", '\0' <repeats 12 times>,
  "100 Au\000\000\000\000\000\000\000\000\000\000", "仔犬に殺された\000\000",
  '\0' <repeats 16 times>, '\0' <repeats 16 times>, '\0' <repeats 16 times>,
  "2014", '\0' <repeats 12 times>}
(gdb)

墓石に文字を刻む処理で何かが起きているようです (デバッガの使い方が下手ですいません)。少なくとも文字長 (len) 4 に対して総幅 (width) 8 が戻って来るのはおかしいと思います。

その原因ですが、include/xwindow.h に必要な関数プロトタイプ宣言が抜けているためのようです。上記 XmbTextEscapement() を実行する直前で

        XFontSet fontset = WindowFontSet(w);  
としてますが、WindowFontSet() の関数プロトタイプ宣言が無いために、戻り値が正しく扱われていないようです。この部分、コンパイルの段階で以下の warning が出ています。
cc -pipe -g -I../include -DX11_GRAPHICS -I/usr/local/include -c ../win/X11/wintext.c  
../win/X11/wintext.c: In function 'rip_exposed':  
../win/X11/wintext.c:679: warning: initialization makes pointer from integer without a cast  


再現する環境ですが、試した限りで FreeBSD 8.4/9.1/9.3/10.0 の amd64 版で再現しました。9.1/9.3 の i386 版では再現しません。

ただし、Vine Linux 6.2.1 (Kernel 3.4.69, gcc-4.4.5) の x86_64 版でも再現しないので (上記 warning も出ない)、64bit 環境ならそうなる、と言い切れるものではないようです。


以下のパッチで再現しなくなりました。FreeBSD ports コレクションには障害報告として同じパッチを投稿しています (先日 commit されました)。

--- include/xwindow.h.orig      2003-12-08 08:39:13.000000000 +0900
+++ include/xwindow.h   2014-10-17 22:46:12.000000000 +0900
@@ -78,6 +78,9 @@
 
 extern XFontStruct *WindowFontStruct(/* Widget */);
 extern Font WindowFont(/* Widget */);
+#ifdef XI18N
+extern XFontSet WindowFontSet(/* Widget */);
+#endif
 
 #define XtCWindowResource "WindowResource"
 #define XtCRows                        "Rows"

Ticket History (2/2 Histories)

2014-11-13 22:23 Updated by: racer100
  • New Ticket "FreeBSD/amd64 で USE_XPM を有効にすると墓石表示時に segmentation fault" created
2016-02-15 20:41 Updated by: argrath
  • Resolution Update from None to Fixed
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2016-02-15 20:41
Comment

ありがとうございました。

gitレポジトリに登録して、3.6.0-0.1でリリースしました。(まだX11で正しく動いていませんが…)

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login