summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-04-04 21:03:21 -0700
committerJunio C Hamano <gitster@pobox.com>2013-04-05 10:31:09 -0700
commit88ff684dd54f2a4793387f7162357005a4777ff2 (patch)
tree728a60ee2993e595a897bc2a46be3a00928875a7
parentebb722625805a0e98b5b8c062b79abd8eca1f639 (diff)
downloadgit-88ff684dd54f2a4793387f7162357005a4777ff2.tar.gz
diffcore-pickaxe: fix leaks in "log -S<block>" and "log -G<pattern>"
The diff_grep() and has_changes() functions had early return codepaths for unmerged filepairs, which simply returned 0. When we taught textconv filter to them, one was ignored and continued to return early without freeing the result filtered by textconv, and the other had a failed attempt to fix, which allowed the planned return value 0 to be overwritten by a bogus call to contains(). Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--diffcore-pickaxe.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index bfaababbe5..cadb071a44 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -99,9 +99,10 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
if (!DIFF_FILE_VALID(p->one)) {
if (!DIFF_FILE_VALID(p->two))
- return 0; /* ignore unmerged */
- /* created "two" -- does it have what we are looking for? */
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
+ hit = 0; /* ignore unmerged */
+ else
+ /* created "two" -- does it have what we are looking for? */
+ hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
} else if (!DIFF_FILE_VALID(p->two)) {
/* removed "one" -- did it have what we are looking for? */
hit = !regexec(regexp, mf1.ptr, 1, &regmatch, 0);
@@ -229,8 +230,9 @@ static int has_changes(struct diff_filepair *p, struct diff_options *o,
if (!DIFF_FILE_VALID(p->one)) {
if (!DIFF_FILE_VALID(p->two))
ret = 0; /* ignore unmerged */
- /* created */
- ret = contains(&mf2, o, regexp, kws) != 0;
+ else
+ /* created */
+ ret = contains(&mf2, o, regexp, kws) != 0;
}
else if (!DIFF_FILE_VALID(p->two)) /* removed */
ret = contains(&mf1, o, regexp, kws) != 0;