diff -upr uim-1.4.2.org/uim/uim-func.c uim-1.4.2-iconv.bugfix/uim/uim-func.c --- uim-1.4.2.org/uim/uim-func.c 2008-02-19 18:16:27.000000000 +0900 +++ uim-1.4.2-iconv.bugfix/uim/uim-func.c 2008-03-05 04:48:48.000000000 +0900 @@ -277,7 +277,10 @@ uim_iconv_code_conv(void *obj, const cha outbuf = realbuf; inbuf = str; bzero(realbuf, buflen); + buflen --; /* To add '\x0'. */ iconv(ic, (ICONV_CONST char **)&inbuf, &len, &outbuf, &buflen); + iconv(ic, NULL, NULL, &outbuf, &buflen); + *outbuf = '\x0'; return strdup(realbuf); } diff -upr uim-1.4.2.org/xim/compose.cpp uim-1.4.2-iconv.bugfix/xim/compose.cpp --- uim-1.4.2.org/xim/compose.cpp 2008-02-19 18:16:27.000000000 +0900 +++ uim-1.4.2-iconv.bugfix/xim/compose.cpp 2008-03-05 04:50:12.000000000 +0900 @@ -1219,9 +1219,17 @@ mb_string_to_utf8(char *utf8, const char inchar = (char *)inbuf; outchar = outbuf; inbytesleft = strlen(inbuf); - outbytesleft = outbufsize; - ret_val = iconv(cd, (ICONV_CONST char **)&inchar, &inbytesleft, &outchar, &outbytesleft); + outbytesleft = outbufsize - 1; /* To add '\x0'. */ + ret_val = iconv(cd, (ICONV_CONST char **)&inchar, &inbytesleft, &outchar, &outbytesleft); + if (ret_val == (size_t)-1 && errno != E2BIG) { + //perror("error in iconv"); + iconv_close(cd); + free(outbuf); + utf8[0] = '\0'; + return 0; + } + ret_val = iconv(cd, NULL, NULL, &outchar, &outbytesleft); if (ret_val == (size_t)-1 && errno != E2BIG) { //perror("error in iconv"); iconv_close(cd); @@ -1229,6 +1237,8 @@ mb_string_to_utf8(char *utf8, const char utf8[0] = '\0'; return 0; } + *outchar = '\x0'; + iconv_close(cd); strlcpy(utf8, outbuf, outbufsize - outbytesleft + 1); diff -upr uim-1.4.2.org/xim/locale.cpp uim-1.4.2-iconv.bugfix/xim/locale.cpp --- uim-1.4.2.org/xim/locale.cpp 2008-02-19 18:16:27.000000000 +0900 +++ uim-1.4.2-iconv.bugfix/xim/locale.cpp 2008-03-05 04:50:47.000000000 +0900 @@ -269,14 +269,21 @@ char *UTF8_Locale::utf8_to_native_str(ch inchar = inbuf; outchar = outbuf; inbytesleft = strlen(inbuf); - outbytesleft = outbufsize; - ret_val = iconv(m_iconv_cd, (ICONV_CONST char **)&inchar, &inbytesleft, &outchar, &outbytesleft); + outbytesleft = outbufsize - 1; /* To add '\x0'. */ + ret_val = iconv(m_iconv_cd, (ICONV_CONST char **)&inchar, &inbytesleft, &outchar, &outbytesleft); + if (ret_val == (size_t)-1 && errno != E2BIG) { + //perror("error in iconv"); + free(outbuf); + return NULL; + } + ret_val = iconv(m_iconv_cd, NULL, NULL, &outchar, &outbytesleft); if (ret_val == (size_t)-1 && errno != E2BIG) { //perror("error in iconv"); free(outbuf); return NULL; } + *outchar = '\x0'; convstr = (char *)malloc(outbufsize - outbytesleft + 1); if (!convstr) {