summaryrefslogtreecommitdiff
path: root/diffcore-pickaxe.c
diff options
context:
space:
mode:
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>2011-10-06 18:14:55 +0200
committerJunio C Hamano <gitster@pobox.com>2011-10-07 15:46:13 -0700
commit2b5f07f16c9e554482ed4a2355a051feabd62848 (patch)
treeda99a54b6d9e3988ff422a6e7f677c88be3aaa23 /diffcore-pickaxe.c
parent05ac978495e84fe03d91ab591524b7ea138900ed (diff)
downloadgit-2b5f07f16c9e554482ed4a2355a051feabd62848.tar.gz
pickaxe: plug regex leak
With -G... --pickaxe-all, free the regex before returning even if we found a match. Also get rid of the variable has_changes, as we can simply break out of the loop. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diffcore-pickaxe.c')
-rw-r--r--diffcore-pickaxe.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 0835a3be8d..96f7ea67da 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -96,7 +96,7 @@ static int diff_grep(struct diff_filepair *p, regex_t *regexp, struct diff_optio
static void diffcore_pickaxe_grep(struct diff_options *o)
{
struct diff_queue_struct *q = &diff_queued_diff;
- int i, has_changes, err;
+ int i, err;
regex_t regex;
struct diff_queue_struct outq;
outq.queue = NULL;
@@ -112,13 +112,11 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
/* Showing the whole changeset if needle exists */
- for (i = has_changes = 0; !has_changes && i < q->nr; i++) {
+ for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (diff_grep(p, &regex, o))
- has_changes++;
+ goto out; /* do not munge the queue */
}
- if (has_changes)
- return; /* do not munge the queue */
/*
* Otherwise we will clear the whole queue by copying
@@ -138,10 +136,11 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
}
}
- regfree(&regex);
-
free(q->queue);
*q = outq;
+
+ out:
+ regfree(&regex);
return;
}