-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' - -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu' - -DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' - -DSHELL -DHAVE_CONFIG_H -I. -I../bash -I../bash/include - -I../bash/lib -g -O2 -Wall uname output: Linux DETH00 3.0.0-15-generic #26-Ubuntu SMP Fri Jan 20 17:23:00 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 4.2 Patch Level: 10 Release Status: release Description: Now I may be misreading the code but it looks like the code relating to iconv is only checking the destination charset the first time, the code is executed. as such breaking the following functionality. LC_CTYPE=C printf '\uff' LC_CTYPE=C.UTF-8 printf '\uff' Repeat-By: haven't seen the problem. Fix: Not so much a fix as a modification that should hopefully clarify my concern. diff --git a/lib/sh/unicode.c b/lib/sh/unicode.c index d34fa08..3f7d378 100644 - --- a/lib/sh/unicode.c +++ b/lib/sh/unicode.c @@ -54,7 +54,7 @@ extern const char *locale_charset __P((void)); extern char *get_locale_var __P((char *)); #endif - -static int u32init = 0; +const char *charset; static int utf8locale = 0; #if defined (HAVE_ICONV) static iconv_t localconv; @@ -115,26 +115,61 @@ u32tochar (wc, s) } @@ -150,7 +185,7 @@ u32cconv (c, s) wchar_t wc; int n; #if HAVE_ICONV - - const char *charset; + const char *ncharset; char obuf[25], *optr; size_t obytesleft; const char *iptr; @@ -171,20 +206,22 @@ u32cconv (c, s) codeset = nl_langinfo (CODESET); if (STREQ (codeset, "UTF-8")) { n = u32toutf8 (wc, s); return n; } #endif #if HAVE_ICONV - - /* this is mostly from coreutils-8.5/lib/unicodeio.c */ - - if (u32init == 0) - - { # if HAVE_LOCALE_CHARSET - - charset = locale_charset (); /* XXX - fix later */ + ncharset = locale_charset (); /* XXX - fix later */ # else - - charset = stub_charset (); + ncharset = stub_charset (); # endif + /* this is mostly from coreutils-8.5/lib/unicodeio.c */ + if (STREQ (charset, ncharset)) + { + /* Free Old charset str ? */ + charset=ncharset; if (STREQ (charset, "UTF-8")) utf8locale = 1; else -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iQEcBAEBAgAGBQJPP5SCAAoJEKUDtR0WmS05L8QH/RUz/X8QZk7HXDIFUTCd0Eah MkfWpCtib9Jt5jUBcb+/UZKiwTSxYGm7D9X08Tpho+i7c+3kknWUGTkivqg7eVo4 TlRA+N4k3x8PdpbYPFNGxgy9LRSViQjqbbzNfYaX+Pbi2YIbZRuaPBipEdbvBqDG bN7KaUM/97vZicZn5SOrhcDiq1RfJosdTkr7egEON4P4BBIXIVk4vRcCF/xXCw6M w2BmvpavV3ra1TXhYN2C678qMyncq5kr8e0tvIl4EY6oCurMlvXhoNkOcz14fOMa XrYJUu1dDNKXmTsJFjDGZhyzvTejLVezjn91/so2OINinqHW++2IMFim5ED9w28= =rW+v -----END PGP SIGNATURE-----