Correctly check for printable characters using wchar_t* and iswprint(). Signed-off-by: Roman Rakus <rra...@redhat.com> --- bash-4.2/lib/sh/strtrans.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/bash-4.2/lib/sh/strtrans.c b/bash-4.2/lib/sh/strtrans.c index 57f9af0..a31bff0 100644 --- a/bash-4.2/lib/sh/strtrans.c +++ b/bash-4.2/lib/sh/strtrans.c @@ -212,6 +212,11 @@ ansic_quote (str, flags, rlen) if (str == 0 || *str == 0) return ((char *)0); +#if defined (HANDLE_MULTIBYTE) + wchar_t wcc; + size_t wc_len; +#endif + l = strlen (str); rsize = 4 * l + 4; r = ret = (char *)xmalloc (rsize); @@ -222,6 +227,9 @@ ansic_quote (str, flags, rlen) for (s = str, l = 0; *s; s++) { c = *s; +#if defined (HANDLE_MULTIBYTE) + wc_len = 1; +#endif l = 1; /* 1 == add backslash; 0 == no backslash */ switch (c) { @@ -243,7 +251,12 @@ ansic_quote (str, flags, rlen) case '\'': break; default: +#if defined (HANDLE_MULTIBYTE) + wc_len = mbrtowc(&wcc, s, MB_CUR_MAX, NULL); + if ((int)wc_len < 0 || iswprint(wcc) == 0) +#else if (ISPRINT (c) == 0) +#endif { *r++ = '\\'; *r++ = TOCHAR ((c >> 6) & 07); @@ -256,7 +269,12 @@ ansic_quote (str, flags, rlen) } if (l) *r++ = '\\'; +#if defined (HANDLE_MULTIBYTE) + for (; (int)wc_len > 0; wc_len--, c = wc_len ? *++s : c) + *r++ = c; +#else *r++ = c; +#endif } *r++ = '\''; -- 1.7.6