talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 130e22b7e2e44262ae7e0971f674454d0e60eaa4
parent d9d96f383ec49c69b079c91e8feb3a1e16b1a811
Author: Colin Leroy <colin@colino.net>
Date:   Fri, 21 Aug 2009 05:42:47 +0000

2009-08-21 [colin]	3.7.2cvs20

	* src/codeconv.c
	* src/codeconv.h
		Fix bug 1969, 'Bad guess for outgoing encoding'
		Make sure the specific converters (japanese in
		this case) can return success/error in strict
		mode, instead of silently failing back to
		strncpy

Diffstat:
MChangeLog | 10++++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/codeconv.c | 139+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/codeconv.h | 2+-
5 files changed, 99 insertions(+), 55 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,13 @@ +2009-08-21 [colin] 3.7.2cvs20 + + * src/codeconv.c + * src/codeconv.h + Fix bug 1969, 'Bad guess for outgoing encoding' + Make sure the specific converters (japanese in + this case) can return success/error in strict + mode, instead of silently failing back to + strncpy + 2009-08-20 [holger] 3.7.2cvs19 * src/compose.c diff --git a/PATCHSETS b/PATCHSETS @@ -3844,3 +3844,4 @@ ( cvs diff -u -r 1.3.2.32 -r 1.3.2.33 src/ldapquery.c; ) > 3.7.2cvs17.patchset ( cvs diff -u -r 1.115.2.221 -r 1.115.2.222 src/main.c; ) > 3.7.2cvs18.patchset ( cvs diff -u -r 1.382.2.519 -r 1.382.2.520 src/compose.c; cvs diff -u -r 1.50.2.54 -r 1.50.2.55 src/compose.h; ) > 3.7.2cvs19.patchset +( cvs diff -u -r 1.65.2.68 -r 1.65.2.69 src/codeconv.c; cvs diff -u -r 1.15.2.22 -r 1.15.2.23 src/codeconv.h; ) > 3.7.2cvs20.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=7 MICRO_VERSION=2 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=19 +EXTRA_VERSION=20 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/codeconv.c b/src/codeconv.c @@ -123,27 +123,27 @@ static CharSet conv_get_outgoing_charset (void); static CharSet conv_guess_ja_encoding(const gchar *str); static gboolean conv_is_ja_locale (void); -static void conv_jistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_euctojis(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_sjistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_jistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_euctojis(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_sjistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_jistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_sjistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_anytoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_jistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_sjistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_anytoutf8(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_utf8tojis(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_utf8tojis(gchar *outbuf, gint outlen, const gchar *inbuf); static void conv_unreadable_8bit(gchar *str); -static void conv_jistodisp(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_sjistodisp(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_euctodisp(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_jistodisp(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_sjistodisp(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_euctodisp(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_anytodisp(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_ustodisp(gchar *outbuf, gint outlen, const gchar *inbuf); -static void conv_noconv(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_anytodisp(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_ustodisp(gchar *outbuf, gint outlen, const gchar *inbuf); +static gint conv_noconv(gchar *outbuf, gint outlen, const gchar *inbuf); static gboolean strict_mode = FALSE; @@ -152,7 +152,7 @@ void codeconv_set_strict(gboolean mode) strict_mode = mode; } -static void conv_jistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_jistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf) { const guchar *in = inbuf; guchar *out = outbuf; @@ -219,6 +219,7 @@ static void conv_jistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf) } *out = '\0'; + return 0; } #define JIS_HWDAKUTEN 0x5e @@ -287,7 +288,7 @@ static gint conv_jis_hantozen(guchar *outbuf, guchar jis_code, guchar sound_sym) return 1; } -static void conv_euctojis(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_euctojis(gchar *outbuf, gint outlen, const gchar *inbuf) { const guchar *in = inbuf; guchar *out = outbuf; @@ -373,9 +374,10 @@ static void conv_euctojis(gchar *outbuf, gint outlen, const gchar *inbuf) K_OUT(); *out = '\0'; + return 0; } -static void conv_sjistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_sjistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf) { const guchar *in = inbuf; guchar *out = outbuf; @@ -419,19 +421,23 @@ static void conv_sjistoeuc(gchar *outbuf, gint outlen, const gchar *inbuf) } *out = '\0'; + return 0; } -static void conv_jistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_jistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) { gchar *eucstr; - Xalloca(eucstr, outlen, return); + Xalloca(eucstr, outlen, return -1); - conv_jistoeuc(eucstr, outlen, inbuf); - conv_euctoutf8(outbuf, outlen, eucstr); + if (conv_jistoeuc(eucstr, outlen, inbuf) <0) + return -1; + if (conv_euctoutf8(outbuf, outlen, eucstr) < 0) + return -1; + return 0; } -static void conv_sjistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_sjistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) { gchar *tmpstr; @@ -439,11 +445,14 @@ static void conv_sjistoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) if (tmpstr) { strncpy2(outbuf, tmpstr, outlen); g_free(tmpstr); - } else + return 0; + } else { strncpy2(outbuf, inbuf, outlen); + return -1; + } } -static void conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) { static iconv_t cd = (iconv_t)-1; static gboolean iconv_ok = TRUE; @@ -452,7 +461,7 @@ static void conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) if (cd == (iconv_t)-1) { if (!iconv_ok) { strncpy2(outbuf, inbuf, outlen); - return; + return -1; } cd = iconv_open(CS_UTF_8, CS_EUC_JP_MS); if (cd == (iconv_t)-1) { @@ -462,7 +471,7 @@ static void conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) g_strerror(errno)); iconv_ok = FALSE; strncpy2(outbuf, inbuf, outlen); - return; + return -1; } } } @@ -471,29 +480,36 @@ static void conv_euctoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) if (tmpstr) { strncpy2(outbuf, tmpstr, outlen); g_free(tmpstr); - } else + return 0; + } else { strncpy2(outbuf, inbuf, outlen); + return -1; + } } -static void conv_anytoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_anytoutf8(gchar *outbuf, gint outlen, const gchar *inbuf) { + gint r = -1; switch (conv_guess_ja_encoding(inbuf)) { case C_ISO_2022_JP: - conv_jistoutf8(outbuf, outlen, inbuf); + r = conv_jistoutf8(outbuf, outlen, inbuf); break; case C_SHIFT_JIS: - conv_sjistoutf8(outbuf, outlen, inbuf); + r = conv_sjistoutf8(outbuf, outlen, inbuf); break; case C_EUC_JP: - conv_euctoutf8(outbuf, outlen, inbuf); + r = conv_euctoutf8(outbuf, outlen, inbuf); break; default: + r = 0; strncpy2(outbuf, inbuf, outlen); break; } + + return r; } -static void conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf) { static iconv_t cd = (iconv_t)-1; static gboolean iconv_ok = TRUE; @@ -502,7 +518,7 @@ static void conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf) if (cd == (iconv_t)-1) { if (!iconv_ok) { strncpy2(outbuf, inbuf, outlen); - return; + return -1; } cd = iconv_open(CS_EUC_JP_MS, CS_UTF_8); if (cd == (iconv_t)-1) { @@ -512,7 +528,7 @@ static void conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf) g_strerror(errno)); iconv_ok = FALSE; strncpy2(outbuf, inbuf, outlen); - return; + return -1; } } } @@ -521,18 +537,25 @@ static void conv_utf8toeuc(gchar *outbuf, gint outlen, const gchar *inbuf) if (tmpstr) { strncpy2(outbuf, tmpstr, outlen); g_free(tmpstr); - } else + return 0; + } else { strncpy2(outbuf, inbuf, outlen); + return -1; + } } -static void conv_utf8tojis(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_utf8tojis(gchar *outbuf, gint outlen, const gchar *inbuf) { gchar *eucstr; - Xalloca(eucstr, outlen, return); + Xalloca(eucstr, outlen, return -1); - conv_utf8toeuc(eucstr, outlen, inbuf); - conv_euctojis(outbuf, outlen, eucstr); + if (conv_utf8toeuc(eucstr, outlen, inbuf) < 0) + return -1; + if (conv_euctojis(outbuf, outlen, eucstr) < 0) + return -1; + + return 0; } static void conv_unreadable_8bit(gchar *str) @@ -590,19 +613,19 @@ static CharSet conv_guess_ja_encoding(const gchar *str) return guessed; } -static void conv_jistodisp(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_jistodisp(gchar *outbuf, gint outlen, const gchar *inbuf) { - conv_jistoutf8(outbuf, outlen, inbuf); + return conv_jistoutf8(outbuf, outlen, inbuf); } -static void conv_sjistodisp(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_sjistodisp(gchar *outbuf, gint outlen, const gchar *inbuf) { - conv_sjistoutf8(outbuf, outlen, inbuf); + return conv_sjistoutf8(outbuf, outlen, inbuf); } -static void conv_euctodisp(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_euctodisp(gchar *outbuf, gint outlen, const gchar *inbuf) { - conv_euctoutf8(outbuf, outlen, inbuf); + return conv_euctoutf8(outbuf, outlen, inbuf); } void conv_utf8todisp(gchar *outbuf, gint outlen, const gchar *inbuf) @@ -613,17 +636,22 @@ void conv_utf8todisp(gchar *outbuf, gint outlen, const gchar *inbuf) conv_ustodisp(outbuf, outlen, inbuf); } -static void conv_anytodisp(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_anytodisp(gchar *outbuf, gint outlen, const gchar *inbuf) { - conv_anytoutf8(outbuf, outlen, inbuf); + gint r = 0; + if (conv_anytoutf8(outbuf, outlen, inbuf) < 0) + r = -1; if (g_utf8_validate(outbuf, -1, NULL) != TRUE) conv_unreadable_8bit(outbuf); + return r; } -static void conv_ustodisp(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_ustodisp(gchar *outbuf, gint outlen, const gchar *inbuf) { strncpy2(outbuf, inbuf, outlen); conv_unreadable_8bit(outbuf); + + return 0; } void conv_localetodisp(gchar *outbuf, gint outlen, const gchar *inbuf) @@ -656,9 +684,10 @@ void conv_localetodisp(gchar *outbuf, gint outlen, const gchar *inbuf) } } -static void conv_noconv(gchar *outbuf, gint outlen, const gchar *inbuf) +static gint conv_noconv(gchar *outbuf, gint outlen, const gchar *inbuf) { strncpy2(outbuf, inbuf, outlen); + return 0; } static const gchar * @@ -697,7 +726,7 @@ gint conv_convert(CodeConverter *conv, gchar *outbuf, gint outlen, const gchar *inbuf) { if (conv->code_conv_func != conv_noconv) - conv->code_conv_func(outbuf, outlen, inbuf); + return conv->code_conv_func(outbuf, outlen, inbuf); else { gchar *str; @@ -733,8 +762,12 @@ gchar *conv_codeset_strdup(const gchar *inbuf, buf = g_malloc(len); if (!buf) return NULL; - conv_func(buf, len, inbuf); - return g_realloc(buf, strlen(buf) + 1); + if (conv_func(buf, len, inbuf) == 0 || !strict_mode) + return g_realloc(buf, strlen(buf) + 1); + else { + g_free(buf); + return NULL; + } } return conv_iconv_strdup(inbuf, src_code, dest_code); diff --git a/src/codeconv.h b/src/codeconv.h @@ -92,7 +92,7 @@ typedef enum C_TCVN5712_1 } CharSet; -typedef void (*CodeConvFunc) (gchar *outbuf, gint outlen, const gchar *inbuf); +typedef gint (*CodeConvFunc) (gchar *outbuf, gint outlen, const gchar *inbuf); struct _CodeConverter {