From b061d24916fb9a14da37a3f2a05cb80dc65cfd38 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 5 Dec 2022 14:16:45 -0800 Subject: [PATCH] grep: bug: backref in last of multiple patterns * NEWS: Mention this. * src/dfasearch.c (GEAcompile): Trim trailing newline from the last pattern, even if it has back-references and follows a pattern that lacks back-references. * tests/backref: Add test for this bug. --- NEWS | 6 ++++++ src/dfasearch.c | 25 ++++++++++++------------- tests/backref | 8 ++++++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/NEWS b/NEWS index da293a3..6c00b2b 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU grep NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + + When given multiple patterns the last of which has a back-reference, + grep no longer sometimes mistakenly matches lines in some cases. + [Bug#36148#13 introduced in grep 3.4] + * Noteworthy changes in release 3.8 (2022-09-02) [stable] diff --git a/src/dfasearch.c b/src/dfasearch.c index a71902a..a5b0d90 100644 --- a/src/dfasearch.c +++ b/src/dfasearch.c @@ -281,20 +281,19 @@ GEAcompile (char *pattern, idx_t size, reg_syntax_t syntax_bits, if (compilation_failed) exit (EXIT_TROUBLE); - if (prev <= patlim) + if (patlim < prev) + buflen--; + else if (pattern < prev) { - if (pattern < prev) - { - idx_t prevlen = patlim - prev; - buf = xirealloc (buf, buflen + prevlen); - memcpy (buf + buflen, prev, prevlen); - buflen += prevlen; - } - else - { - buf = pattern; - buflen = size; - } + idx_t prevlen = patlim - prev; + buf = xirealloc (buf, buflen + prevlen); + memcpy (buf + buflen, prev, prevlen); + buflen += prevlen; + } + else + { + buf = pattern; + buflen = size; } /* In the match_words and match_lines cases, we use a different pattern diff --git a/tests/backref b/tests/backref index 510e130..97cb157 100755 --- a/tests/backref +++ b/tests/backref @@ -43,4 +43,12 @@ if test $? -ne 2 ; then failures=1 fi +# https://bugs.gnu.org/36148#13 +echo 'Total failed: 2 (1 ignored)' | + grep -e '^Total failed: 0$' -e '^Total failed: \([0-9]*\) (\1 ignored)$' +if test $? -ne 1 ; then + echo "Backref: Multiple -e test, test #5 failed" + failures=1 +fi + Exit $failures -- 2.38.1