]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pickaxe -S: support content with NULs under --pickaxe-regex
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Mon, 12 Apr 2021 17:15:21 +0000 (19:15 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 May 2021 03:47:31 +0000 (12:47 +0900)
Fix a bug in the matching routine powering -S<rx> --pickaxe-regex so
that we won't abort early on content that has NULs in it.

We've had a hard requirement on REG_STARTEND since 2f8952250a8 (regex:
add regexec_buf() that can work on a non NUL-terminated string,
2016-09-21), but this sanity check dates back to d01d8c67828 (Support
for pickaxe matching regular expressions, 2006-03-29).

It wasn't needed anymore, and as the now-passing test shows, actively
getting in our way. Since we always require REG_STARTEND support we do
not need to stop at NULs. If we are dealing with a haystack with NUL
in it. The needle may be behind that NUL.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diffcore-pickaxe.c
t/t4209-log-pickaxe.sh

index 88b6ca840f64f4a66bc263c25baf2412df7a97a2..be0dd683b63a8cd52af2762ef4fc9657f79af005 100644 (file)
@@ -78,12 +78,12 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
                regmatch_t regmatch;
                int flags = 0;
 
-               while (sz && *data &&
+               while (sz &&
                       !regexec_buf(regexp, data, sz, 1, &regmatch, flags)) {
                        flags |= REG_NOTBOL;
                        data += regmatch.rm_eo;
                        sz -= regmatch.rm_eo;
-                       if (sz && *data && regmatch.rm_so == regmatch.rm_eo) {
+                       if (sz && regmatch.rm_so == regmatch.rm_eo) {
                                data++;
                                sz--;
                        }
index 3f9aad0fdb060dc97029fe06a54a0cce87797837..75795d0b492b4b3a32ab0539a1932bd9c38fcd6c 100755 (executable)
@@ -215,4 +215,12 @@ test_expect_success 'log -S looks into binary files' '
        test_cmp log full-log
 '
 
+test_expect_success 'log -S --pickaxe-regex looks into binary files' '
+       git -C GS-bin-txt log --pickaxe-regex -Sa >log &&
+       test_cmp log full-log &&
+
+       git -C GS-bin-txt log --pickaxe-regex -S"[a]" >log &&
+       test_cmp log full-log
+'
+
 test_done