From: Eric Biggers Date: Wed, 20 Mar 2013 05:51:07 +0000 (-0500) Subject: Fix utf16le_strlen() and recursive error messages X-Git-Tag: v1.3.0~10 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=687d07120a2d543f02bffe88efdf9583fbab1459 Fix utf16le_strlen() and recursive error messages --- diff --git a/src/encoding.c b/src/encoding.c index e0f4e2d0..980e4cfc 100644 --- a/src/encoding.c +++ b/src/encoding.c @@ -101,6 +101,11 @@ put_iconv(iconv_t *cd) errno = errno_save; } +/* Prevent printing an error message if a character conversion error occurs + * while printing an error message. (This variable is not per-thread but it + * doesn't matter too much since it's just the error messages.) */ +static bool error_message_being_printed = false; + #define DEFINE_CHAR_CONVERSION_FUNCTIONS(varname1, longname1, chartype1,\ varname2, longname2, chartype2,\ worst_case_len_expr, \ @@ -128,7 +133,11 @@ varname1##_to_##varname2##_nbytes(const chartype1 *in, size_t in_nbytes,\ \ len = iconv(*cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); \ if (len == (size_t)-1) { \ - err_msg; \ + if (!error_message_being_printed) { \ + error_message_being_printed = true; \ + err_msg; \ + error_message_being_printed = false; \ + } \ ret = err_return; \ } else { \ *out_nbytes_ret = sizeof(buf) - outbytesleft; \ diff --git a/src/util.c b/src/util.c index eb0ea9af..3c682ce0 100644 --- a/src/util.c +++ b/src/util.c @@ -53,7 +53,7 @@ static size_t utf16le_strlen(const utf16lechar *s) const utf16lechar *p = s; while (*p) p++; - return (p - s) / sizeof(utf16lechar); + return (p - s) * sizeof(utf16lechar); } /* Handle %W for UTF16-LE printing and %U for UTF-8 printing.