--- gnu/usr.bin/grep/search.c.orig Wed Mar 22 05:51:35 2006 +++ gnu/usr.bin/grep/search.c Tue Jun 5 01:09:24 2007 @@ -400,9 +400,12 @@ } if (mlen == (size_t) -2) - /* Offset points inside multibyte character: - * no good. */ - break; + { + /* Offset points inside multibyte character: + * no good. */ + memset (&mbs, '\0', sizeof (mbstate_t)); + break; + } beg += mlen; bytes_left -= mlen; @@ -462,9 +465,12 @@ } if (mlen == (size_t) -2) - /* Offset points inside multibyte character: - * no good. */ - break; + { + /* Offset points inside multibyte character: + * no good. */ + memset (&mbs, '\0', sizeof (mbstate_t)); + break; + } beg += mlen; bytes_left -= mlen; @@ -925,15 +931,21 @@ } if (mlen == (size_t) -2) - /* Offset points inside multibyte character: no good. */ - break; + { + /* Offset points inside multibyte character: no good. */ + memset (&mbs, '\0', sizeof (mbstate_t)); + break; + } beg += mlen; bytes_left -= mlen; } if (bytes_left) - continue; + { + beg += bytes_left; + continue; + } } else #endif /* MBS_SUPPORT */ @@ -1051,6 +1063,7 @@ { /* Offset points inside multibyte character: * no good. */ + memset (&mbs, '\0', sizeof (mbstate_t)); break; }