]> git.ipfire.org Git - thirdparty/git.git/commitdiff
grep: do not enter PCRE2_UTF mode on fixed matching
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Fri, 26 Jul 2019 15:08:17 +0000 (17:08 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 26 Jul 2019 20:56:40 +0000 (13:56 -0700)
As discussed in the last commit partially fix a bug introduced in
b65abcafc7 ("grep: use PCRE v2 for optimized fixed-string search",
2019-07-01). Because PCRE v2, unlike kwset, validates its UTF-8 input
we'd die on e.g.:

    fatal: pcre2_match failed with error code -22: UTF-8 error:
    isolated byte with 0x80 bit set

When grepping a non-ASCII fixed string. This is a more general problem
that's hard to fix, but we can at least fix the most common case of
grepping for a fixed string without "-i". I can't think of a reason
for why we'd turn on PCRE2_UTF when matching byte-for-byte like that.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
grep.c
t/t7812-grep-icase-non-ascii.sh

diff --git a/grep.c b/grep.c
index 5bc0f4f32abc536c2beee3d443b69b56ca82309e..c7c06ae08dd178614a11ae290a63605af01d2c6f 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -472,7 +472,8 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
                }
                options |= PCRE2_CASELESS;
        }
-       if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern))
+       if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern) &&
+           !(!opt->ignore_case && (p->fixed || p->is_fixed)))
                options |= PCRE2_UTF;
 
        p->pcre2_pattern = pcre2_compile((PCRE2_SPTR)p->pattern,
index 96c357205699626796b5c0e936c62ad63782b748..531eb59d5785f2487f87f82cd330b9515642554d 100755 (executable)
@@ -68,9 +68,9 @@ test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep ASCII from invalid UT
 '
 
 test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep non-ASCII from invalid UTF-8 data' '
-       test_might_fail git grep -h "æ" invalid-0x80 >actual &&
+       git grep -h "æ" invalid-0x80 >actual &&
        test_cmp expected actual &&
-       test_must_fail git grep -h "(*NO_JIT)æ" invalid-0x80 &&
+       git grep -h "(*NO_JIT)æ" invalid-0x80 &&
        test_cmp expected actual
 '