]> granicus.if.org Git - neomutt/commitdiff
Improve error handling in mutt_wstr_trunc().
authorKarel Zak <kzak@redhat.com>
Mon, 21 Mar 2016 00:06:16 +0000 (17:06 -0700)
committerKarel Zak <kzak@redhat.com>
Mon, 21 Mar 2016 00:06:16 +0000 (17:06 -0700)
This is Karel Zak's patch to fix handling of (illegal) multi-byte chars.

 * mutt_wstr_trunc():
 Reset mbstate after error in mbrtowc().
 Set wc=0 if wcwidth returns < 0.

Addresses: https://github.com/karelzak/mutt-kz/issues/58

Thanks to Richard Russon for bringing this patch to our attention.

curs_lib.c

index 7a1131f7d09a711e2c3627b2a983454ecb328f56..b400db0aece8591fc35ca22f49d5537e361337d8 100644 (file)
@@ -964,8 +964,10 @@ int mutt_wstr_trunc (const char *src, size_t maxlen, size_t maxwid, size_t *widt
   memset (&mbstate, 0, sizeof (mbstate));
   for (w = 0; n && (cl = mbrtowc (&wc, src, n, &mbstate)); src += cl, n -= cl)
   {
-    if (cl == (size_t)(-1) || cl == (size_t)(-2))
+    if (cl == (size_t)(-1) || cl == (size_t)(-2)) {
       cw = cl = 1;
+      memset(&mbstate, 0, sizeof (mbstate));
+    }
     else
     {
       cw = wcwidth (wc);
@@ -973,6 +975,8 @@ int mutt_wstr_trunc (const char *src, size_t maxlen, size_t maxwid, size_t *widt
        * until rendered by print_enriched_string (#3364) */
       if (cw < 0 && cl == 1 && src[0] && src[0] < M_TREE_MAX)
        cw = 1;
+      else if (cw < 0)
+       cw = 0;                 /* unprintable wchar */
     }
     if (cl + l > maxlen || cw + w > maxwid)
       break;