Skip to content

Commit

Permalink
diff_grep: use textconv buffers for add/deleted files
Browse files Browse the repository at this point in the history
If you use "-G" to grep a diff, we will apply a configured
textconv filter to the data before generating the diff.
However, if the diff is an addition or deletion, we do not
bother running the diff at all, and just look for the token
in the added (or removed) content. This works because we
know that the diff must contain every line of content.

However, while we used the textconv-derived buffers in the
regular diff, we accidentally passed the original unmodified
buffers to regexec when checking the added or removed
content. This could lead to an incorrect answer.

Worse, in some cases we might have a textconv buffer but no
original buffer (e.g., if we pulled the textconv data from
cache, or if we reused a working tree file when generating
it). In that case, we could actually feed NULL to regexec
and segfault.

Reported-by: Peter Oberndorfer <kumbayo84@arcor.de>
Signed-off-by: Jeff King <peff@peff.net>
  • Loading branch information
Jeff King committed Oct 28, 2012
1 parent 7e20105 commit b1c2f57
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
4 changes: 2 additions & 2 deletions diffcore-pickaxe.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,10 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
if (!mf2.ptr)
return 0; /* ignore unmerged */
/* created "two" -- does it have what we are looking for? */
hit = !regexec(regexp, p->two->data, 1, &regmatch, 0);
hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
} else if (!mf2.ptr) {
/* removed "one" -- did it have what we are looking for? */
hit = !regexec(regexp, p->one->data, 1, &regmatch, 0);
hit = !regexec(regexp, mf1.ptr, 1, &regmatch, 0);
} else {
/*
* We have both sides; need to run textual diff and see if
Expand Down
12 changes: 12 additions & 0 deletions t/t4030-diff-textconv.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,18 @@ test_expect_success 'status -v produces text' '
git reset --soft HEAD@{1}
'

test_expect_success 'grep-diff (-G) operates on textconv data (add)' '
echo one >expect &&
git log --root --format=%s -G0 >actual &&
test_cmp expect actual
'

test_expect_success 'grep-diff (-G) operates on textconv data (modification)' '
echo two >expect &&
git log --root --format=%s -G1 >actual &&
test_cmp expect actual
'

cat >expect.stat <<'EOF'
file | Bin 2 -> 4 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
Expand Down

0 comments on commit b1c2f57

Please sign in to comment.