git: e898a3af97f9 - main - grep: properly switch EOL indicator with -z

From: Kyle Evans <kevans_at_FreeBSD.org>
Date: Wed, 04 Jan 2023 05:38:39 UTC
The branch main has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=e898a3af97f97f74c0fb22032bbd163f7cc92a05

commit e898a3af97f97f74c0fb22032bbd163f7cc92a05
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2023-01-04 05:21:10 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2023-01-04 05:37:54 +0000

    grep: properly switch EOL indicator with -z
    
    -z is supposed to use only the NUL byte as EOL, but we were
    inadvertently using both newline and NUL due to REG_NEWLINE in cflags.
    
    The odds of anyone relying on this bsdgrep-specific bug are quite low,
    so let's just fix it.  At least one port in the wild has been reported
    to expect the intended behavior.
    
    Reported by:    Hill Ma <maahiuzeon@gmail.com>
    Triaged by:     the self-proclaimed peanut gallery on Discord
---
 usr.bin/grep/grep.c                     |  1 +
 usr.bin/grep/tests/grep_freebsd_test.sh | 13 +++++++++++++
 2 files changed, 14 insertions(+)

diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c
index 6306cbff5932..3f16d118f0d8 100644
--- a/usr.bin/grep/grep.c
+++ b/usr.bin/grep/grep.c
@@ -562,6 +562,7 @@ main(int argc, char *argv[])
 			break;
 		case 'z':
 			fileeol = '\0';
+			cflags &= ~REG_NEWLINE;
 			break;
 		case BIN_OPT:
 			if (strcasecmp("binary", optarg) == 0)
diff --git a/usr.bin/grep/tests/grep_freebsd_test.sh b/usr.bin/grep/tests/grep_freebsd_test.sh
index 0d068d5d1c65..f6881791357c 100755
--- a/usr.bin/grep/tests/grep_freebsd_test.sh
+++ b/usr.bin/grep/tests/grep_freebsd_test.sh
@@ -92,9 +92,22 @@ gnuext_body()
 
 }
 
+atf_test_case zflag
+zflag_body()
+{
+
+	# The -z flag should pick up 'foo' and 'bar' as on the same line with
+	# 'some kind of junk' in between; a bug was present that instead made
+	# it process this incorrectly.
+	printf "foo\nbar\0" > in
+
+	atf_check grep -qz "foo.*bar" in
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case grep_r_implied
 	atf_add_test_case rgrep
 	atf_add_test_case gnuext
+	atf_add_test_case zflag
 }