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:
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
{