]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diffcore-pickaxe: fix leaks in "log -S<block>" and "log -G<pattern>"
authorJunio C Hamano <gitster@pobox.com>
Fri, 5 Apr 2013 04:03:21 +0000 (21:03 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Apr 2013 17:31:09 +0000 (10:31 -0700)
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>
diffcore-pickaxe.c

index bfaababbe5d836d8b1fa53215bca3c0f405f1ecc..cadb071a441e7e67bb2b6b638d853b0489ac114f 100644 (file)
@@ -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;