aboutsummaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorPedro F. Giffuni <pfg@FreeBSD.org>2019-01-10 02:59:19 +0000
committerPedro F. Giffuni <pfg@FreeBSD.org>2019-01-10 02:59:19 +0000
commitaa52c719ea10ab575fa5c5245b70c4e117477fd4 (patch)
treef4fb9c20c8a7db46dc55dd41225f6fc69b007c5f /gnu
parent3b1522c229fb6ca97a6a141e848bf1cfd76ade44 (diff)
downloadsrc-aa52c719ea10ab575fa5c5245b70c4e117477fd4.tar.gz
src-aa52c719ea10ab575fa5c5245b70c4e117477fd4.zip
grep(1) outputs NOT-matched lines with multi-byte characters
PR 113343 MFC after: 2 months
Notes
Notes: svn path=/head/; revision=342910
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/grep/search.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/gnu/usr.bin/grep/search.c b/gnu/usr.bin/grep/search.c
index 96ee18197434..23fc32f8feba 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;
}