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;
signature.asc
Description: PGP signature
