From 2ae39a8ed08690085d19622050cd56fee7589b13 Mon Sep 17 00:00:00 2001 From: pfg Date: Sun, 10 Feb 2019 23:47:37 +0000 Subject: [PATCH] MFC r342910: grep(1) outputs NOT-matched lines with multi-byte characters PR: 113343 --- gnu/usr.bin/grep/search.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/gnu/usr.bin/grep/search.c b/gnu/usr.bin/grep/search.c index 96ee1819743..23fc32f8feb 100644 --- a/gnu/usr.bin/grep/search.c +++ b/gnu/usr.bin/grep/search.c @@ -401,9 +401,12 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact) } 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; @@ -463,9 +466,12 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact) } 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; @@ -926,15 +932,21 @@ Fexecute (char const *buf, size_t size, size_t *match_size, int exact) } 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 */ @@ -1052,6 +1064,7 @@ Fexecute (char const *buf, size_t size, size_t *match_size, int exact) { /* Offset points inside multibyte character: * no good. */ + memset (&mbs, '\0', sizeof (mbstate_t)); break; } -- 2.45.0