Bug 113343 - [patch] grep(1) outputs NOT-matched lines (with multi-bytes characters)
Summary: [patch] grep(1) outputs NOT-matched lines (with multi-bytes characters)
Status: In Progress
Alias: None
Product: Base System
Classification: Unclassified
Component: gnu (show other bugs)
Version: 6.2-RELEASE
Hardware: Any Any
: Normal Affects Only Me
Assignee: Pedro F. Giffuni
Keywords: patch
Depends on:
Reported: 2007-06-04 19:30 UTC by Kazuaki ODA
Modified: 2019-01-10 03:02 UTC (History)
2 users (show)

See Also:

search.c.diff (1.41 KB, patch)
2007-06-04 19:30 UTC, Kazuaki ODA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Kazuaki ODA 2007-06-04 19:30:05 UTC
	Our grep(1) is a bit broken with multi-bytes characters.
	If byte sequence matches the searched pattern, grep(1) outputs the line
	containing the sequence.  Of course, this is fine for single-byte
	characters, but may be wrong for multi-bytes characters.  If matched
	sequence is the second byte of a character and the first byte of the
	next character, that is not matched and grep(1) should not output the
	Since our grep(1) has support for multi-bytes characters (and locales),
	it does not always behave as described above, but sometimes does.

Fix: Apply attached patch.
	mbstate_t should be initialized whenever mbrlen() returns -2, I think.
Comment 1 Eitan Adler freebsd_committer freebsd_triage 2017-12-31 07:59:19 UTC
For bugs matching the following criteria:

Status: In Progress Changed: (is less than) 2014-06-01

Reset to default assignee and clear in-progress tags.

Mail being skipped
Comment 2 Pedro F. Giffuni freebsd_committer 2019-01-08 19:08:20 UTC
For the record:
FreeBSD 6.2 shipped with GNU grep 2.5.1 whish is basically the same we are using as of FreeBSD 12.0:

% grep --version
grep (GNU grep) 2.5.1-FreeBSD

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO

The patch applies almost cleanly:
 % svn patch --dry-run gnu-grep.diff
U         gnu/usr.bin/grep/search.c
>         applied hunk @@ -400,9 +400,12 @@ with offset 1
>         applied hunk @@ -462,9 +465,12 @@ with offset 1
>         applied hunk @@ -925,15 +931,21 @@ with offset 1
>         applied hunk @@ -1051,5 +1063,6 @@ with offset 1 and fuzz
Comment 3 Pedro F. Giffuni freebsd_committer 2019-01-09 21:54:41 UTC
I have compared to upstream and this code is actually different in our fork of the last GPLv2 release. Newer releases even broke the file in parts. It looks safe as the code paths generally involve a "no good" comment.

I am running the patch in my system to see that nothing goes wild and I will commit it afterwards.

Sorry it took so long, some of us don'tregularly use multibyte strings. :-/.
Comment 4 Pedro F. Giffuni freebsd_committer 2019-01-10 03:02:53 UTC
Committed as r342910.