This patch cleans up other uses of mbrtowc() to reset the mbstate when
they return -1.

I'd like to push this, but given the closeness of the release, thought
it would be better to let others take a look.

-- 
Kevin J. McCarthy
GPG Fingerprint: 8975 A9B3 3AA3 7910 385C  5308 ADEF 7684 8031 6BDA
http://www.8t8.us/configs/gpg-key-transition-statement.txt
# HG changeset patch
# User Kevin McCarthy <[email protected]>
# Date 1458703862 25200
#      Tue Mar 22 20:31:02 2016 -0700
# Node ID e87a8016616614466662f2bbc2fa1231eab03bb0
# Parent  a3450fd50d118f8e138a7606325da66187fe794b
Reset mbstate for other mbrtowc() calls returning -1

Fix the other callers of mbrtowc() to reset the mbstate_t when it
returns -1.

diff --git a/alias.c b/alias.c
--- a/alias.c
+++ b/alias.c
@@ -418,16 +418,18 @@
     if (l == 1)
       bad = bad || (strchr ("-_+=.", *s) == NULL && !iswalnum (wc));
     else
       bad = bad || !iswalnum (wc);
     if (bad)
     {
       if (dry)
        return -1;
+      if (l == (size_t)(-1))
+        memset (&mb, 0, sizeof (mbstate_t));
       *dest++ = '_';
       rv = -1;
     }
     else if (!dry)
     {
       memcpy (dest, s, l);
       dest += l;
     }
diff --git a/curs_lib.c b/curs_lib.c
--- a/curs_lib.c
+++ b/curs_lib.c
@@ -1029,16 +1029,18 @@
 
   n = mutt_strlen (s);
 
   memset (&mbstate, 0, sizeof (mbstate));
   for (w=0; n && (k = mbrtowc (&wc, s, n, &mbstate)); s += k, n -= k)
   {
     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 ();
     }
     if (!IsWPrint (wc))
       wc = '?';
     w += wcwidth (wc);
   }
   return w;
diff --git a/enter.c b/enter.c
--- a/enter.c
+++ b/enter.c
@@ -140,16 +140,18 @@
       {
        wbuflen = i + 20;
        safe_realloc (&wbuf, wbuflen * sizeof (*wbuf));
       }
       wbuf[i++] = wc;
     }
     if (*buf && (k == (size_t) -1 || k == (size_t) -2))
     {
+      if (k == (size_t) (-1))
+        memset (&st, 0, sizeof (st));
       if (i >= wbuflen) 
       {
        wbuflen = i + 20;
        safe_realloc (&wbuf, wbuflen * sizeof (*wbuf));
       }
       wbuf[i++] = replacement_char();
       buf++;
     }
diff --git a/help.c b/help.c
--- a/help.c
+++ b/help.c
@@ -98,31 +98,35 @@
   mbstate_t mbstate1, mbstate2;
 
   memset (&mbstate1, 0, sizeof (mbstate1));
   memset (&mbstate2, 0, sizeof (mbstate2));
   for (; len && (k = mbrtowc (&wc, *macro, len, &mbstate1)); *macro += k, len 
-= k)
   {
     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 ();
     }
     /* glibc-2.1.3's wcwidth() returns 1 for unprintable chars! */
     if (IsWPrint (wc) && (w = wcwidth (wc)) >= 0)
     {
       if (w > n)
        break;
       n -= w;
       {
        char buf[MB_LEN_MAX*2];
        size_t n1, n2;
        if ((n1 = wcrtomb (buf, wc, &mbstate2)) != (size_t)(-1) &&
            (n2 = wcrtomb (buf + n1, 0, &mbstate2)) != (size_t)(-1))
          fputs (buf, f);
+        if (n1 == (size_t) (-1) || n2 == (size_t) (-1))
+          memset (&mbstate2, 0, sizeof (mbstate2));
       }
     }
     else if (wc < 0x20 || wc == 0x7f)
     {
       if (2 > n)
        break;
       n -= 2;
       if (wc == '\033')
@@ -160,16 +164,18 @@
   for (m = wid, n = 0;
        len && (k = mbrtowc (&wc, s, len, &mbstate)) && (n <= wid);
        s += k, len -= k)
   {
     if (*s == ' ')
       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 ();
     }
     if (!IsWPrint (wc))
       wc = '?';
     n += wcwidth (wc);
   }
   if (n > wid)
diff --git a/pager.c b/pager.c
--- a/pager.c
+++ b/pager.c
@@ -1006,20 +1006,24 @@
 {
   mbstate_t mbstate;
   size_t k;
 
   memset (&mbstate, 0, sizeof (mbstate));
   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';
 
   return len;
 }
 
 static int
 fill_buffer (FILE *f, LOFF_T *last_pos, LOFF_T offset, unsigned char **buf,
@@ -1120,16 +1124,18 @@
 
     /* is anything left to do? */
     if (ch >= cnt)
       break;
     
     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)
        break;
       col += 4;
       if (pa)
        printw ("\\%03o", buf[ch]);
       k = 1;

Attachment: signature.asc
Description: PGP signature

Reply via email to