]> granicus.if.org Git - mutt/commitdiff
Reset mbstate for other mbrtowc() calls returning -1
authorKevin McCarthy <kevin@8t8.us>
Fri, 8 Apr 2016 22:20:53 +0000 (15:20 -0700)
committerKevin McCarthy <kevin@8t8.us>
Fri, 8 Apr 2016 22:20:53 +0000 (15:20 -0700)
Continue the cleanup started in changesets c8c76a6a1e61 and
a3450fd50d11.  In those changesets, a bug was occurring due to the
mbstate not being reset when mbrtowc() returned -1.

This patch fixes other callers of mbrtowc() to reset mbstate when it
returns -1.

alias.c
curs_lib.c
help.c
pager.c

diff --git a/alias.c b/alias.c
index cb653fd1984eba002153ec685ca6ae83bc96f6d8..0cb9ebe8d3849c4757ed2dbf390e33cbbe1dc7cc 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -423,6 +423,8 @@ int mutt_check_alias_name (const char *s, char *dest, size_t destlen)
     {
       if (dry)
        return -1;
+      if (l == (size_t)(-1))
+        memset (&mb, 0, sizeof (mbstate_t));
       *dest++ = '_';
       rv = -1;
     }
index 3178f22100ef32dd87d03226602e81513a5ae471..ee1464cacbf8ce132b18a81a77a159319eaa1d5f 100644 (file)
@@ -1034,6 +1034,8 @@ int mutt_strwidth (const char *s)
   {
     if (k == (size_t)(-1) || k == (size_t)(-2))
     {
+      if (k == (size_t)(-1))
+        memset (&mbstate, 0, sizeof (mbstate));
       k = (k == (size_t)(-1)) ? 1 : n;
       wc = replacement_char ();
     }
diff --git a/help.c b/help.c
index c80427437a682faee8d77f1f601f590f20bd8217..c48c68f432dd942d6c4565b3379199463c74bc96 100644 (file)
--- a/help.c
+++ b/help.c
@@ -103,6 +103,8 @@ static int print_macro (FILE *f, int maxwidth, const char **macro)
   {
     if (k == (size_t)(-1) || k == (size_t)(-2))
     {
+      if (k == (size_t)(-1))
+        memset (&mbstate1, 0, sizeof (mbstate1));
       k = (k == (size_t)(-1)) ? 1 : len;
       wc = replacement_char ();
     }
@@ -165,6 +167,8 @@ static int get_wrapped_width (const char *t, size_t wid)
       m = n;
     if (k == (size_t)(-1) || k == (size_t)(-2))
     {
+      if (k == (size_t)(-1))
+        memset (&mbstate, 0, sizeof (mbstate));
       k = (k == (size_t)(-1)) ? 1 : len;
       wc = replacement_char ();
     }
diff --git a/pager.c b/pager.c
index 8bfe72cc9cf9de83f0884e59b89fd3d3438d2e0a..9c26d873c71bd35c30cffa3e8275bf71263ae09d 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -1011,10 +1011,14 @@ trim_incomplete_mbyte(unsigned char *buf, size_t len)
   for (; len > 0; buf += k, len -= k)
   {
     k = mbrtowc (NULL, (char *) buf, len, &mbstate);
-    if (k == -2
+    if (k == (size_t)(-2)
       break; 
-    else if (k == -1 || k == 0) 
+    else if (k == (size_t)(-1) || k == 0)
+    {
+      if (k == (size_t)(-1))
+        memset (&mbstate, 0, sizeof (mbstate));
       k = 1;
+    }
   }
   *buf = '\0';
 
@@ -1125,6 +1129,8 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf,
     k = mbrtowc (&wc, (char *)buf+ch, cnt-ch, &mbstate);
     if (k == -2 || k == -1)
     {
+      if (k == -1)
+        memset(&mbstate, 0, sizeof(mbstate));
       dprint (1, (debugfile, "%s:%d: mbrtowc returned %d; errno = %d.\n",
                  __FILE__, __LINE__, k, errno));
       if (col + 4 > wrap_cols)