pickaxe -S: support content with NULs under --pickaxe-regex

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>

Ævar Arnfjörð Bjarmason committed Apr 12, 2021 at 19:15 UTC 52e011cd2b13e00fe40b1d59986948330b61e030
2 files changed +10 -2
diffcore-pickaxe.c
+2 -2
@@ -78,12 +78,12 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
78 regmatch_t regmatch;
79 int flags = 0;
80
81 - while (sz && *data &&
81 + while (sz &&
82 !regexec_buf(regexp, data, sz, 1, &regmatch, flags)) {
83 flags |= REG_NOTBOL;
84 data += regmatch.rm_eo;
85 sz -= regmatch.rm_eo;
86 - if (sz && *data && regmatch.rm_so == regmatch.rm_eo) {
86 + if (sz && regmatch.rm_so == regmatch.rm_eo) {
87 data++;
88 sz--;
89 }
t/t4209-log-pickaxe.sh
+8
@@ -215,4 +215,12 @@ test_expect_success 'log -S looks into binary files' '
215 test_cmp log full-log
216 '
217
218 +test_expect_success 'log -S --pickaxe-regex looks into binary files' '
219 + git -C GS-bin-txt log --pickaxe-regex -Sa >log &&
220 + test_cmp log full-log &&
221 +
222 + git -C GS-bin-txt log --pickaxe-regex -S"[a]" >log &&
223 + test_cmp log full-log
224 +'
225 +
226 test_done