[前][次][番号順一覧][スレッド一覧]

sylpheed-jp:2551

From: Tomoya TAKA <tomoya@xxxxxxxxxx>
Date: Wed, 28 Jan 2004 22:13:33 +0900
Subject: [sylpheed-jp:02551] Segfault on Linux/Alpha

はじめまして、たか と申します。

最近、Alpha プロセッサ機の Linuxで sylpheed を本格的に
使用し始めたのですが、サマリの生成やメッセージの表示時に、
iconv()が呼ばれた時点で sylpheed が Segfault しました。
# 今までは簡単な送受信テストしか行っていなかったため、
# 運良く(運悪く?)この問題には遭遇していませんでした。

Linux/Alpha では、size_t が 32bit ではなく 64bit なのですが、
codeconv.c 内で iconv() の第3、第5引数に gint 変数のアドレスを
渡しているのが原因のようです。
glibc は 2.3.2 を使用していますが、以前のものでも同様だとおもいます。

以下のパッチで手元では問題を回避できています。
32bit環境でも問題ないと思いますが、テストはしていません。

ちなみに imap.c 内でも iconv() が使用されていますが、
ここでは size_t が使用されているので問題ないと思います。
が、手元に IMAP 環境がないのでこちらも未確認です。


diff -uNr sylpheed-0.9.8a.orig/src/codeconv.c sylpheed-0.9.8a/src/codeconv.c
--- sylpheed-0.9.8a.orig/src/codeconv.c	2003-12-04 13:52:47.000000000 +0900
+++ sylpheed-0.9.8a/src/codeconv.c	2004-01-28 16:06:00.000000000 +0900
@@ -803,9 +803,9 @@
 	gchar *outbuf;
 	gchar *outbuf_p;
 	gint in_size;
-	gint in_left;
+	size_t in_left;
 	gint out_size;
-	gint out_left;
+	size_t out_left;
 	gint n_conv;
 	gint len;
 
@@ -828,11 +828,11 @@
 
 	inbuf_p = inbuf;
 	in_size = strlen(inbuf);
-	in_left = in_size;
+	in_left = (size_t)in_size;
 	out_size = (in_size + 1) * 2;
 	outbuf = g_malloc(out_size);
 	outbuf_p = outbuf;
-	out_left = out_size;
+	out_left = (size_t)out_size;
 
 #define EXPAND_BUF()				\
 {						\
@@ -840,7 +840,7 @@
 	out_size *= 2;				\
 	outbuf = g_realloc(outbuf, out_size);	\
 	outbuf_p = outbuf + len;		\
-	out_left = out_size - len;		\
+	out_left = (size_t)(out_size - len);	\
 }
 
 	while ((n_conv = iconv(cd, (ICONV_CONST gchar **)&inbuf_p, &in_left,

-- 
Tomoya TAKA <tomoya@xxxxxxxxxx>






[前][次][番号順一覧][スレッド一覧]

->    2551 2004-01-28 22:13 [tomoya@xxxxxxxxxx   ] Segfault on Linux/Alpha                 
      2552 2004-01-29 12:23 ┗[hiro-y@xxxxxxxxxx   ]                                       
      2554 2004-01-29 23:40  ┗[tomoya@xxxxxxxxxx   ]