1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-09 00:56:29 +02:00

reduce_heads: fix memory leaks

We currently have seven callers of `reduce_heads(foo)`. Six of them do
not use the original list `foo` again, and actually, all six of those
end up leaking it.

Introduce and use `reduce_heads_replace(&foo)` as a leak-free version of
`foo = reduce_heads(foo)` to fix several of these. Fix the remaining
leaks using `free_commit_list()`.

While we're here, document `reduce_heads()` and mark it as `extern`.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Martin Ågren 2017-11-07 21:39:45 +01:00 committed by Junio C Hamano
parent a452d0f4ba
commit 4da72644b7
7 changed files with 35 additions and 6 deletions

View File

@ -1728,7 +1728,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
allow_fast_forward = 0;
}
if (allow_fast_forward)
parents = reduce_heads(parents);
reduce_heads_replace(&parents);
} else {
if (!reflog_msg)
reflog_msg = (whence == FROM_CHERRY_PICK)

View File

@ -571,7 +571,7 @@ static void find_merge_parents(struct merge_parents *result,
head_commit = lookup_commit(head);
if (head_commit)
commit_list_insert(head_commit, &parents);
parents = reduce_heads(parents);
reduce_heads_replace(&parents);
while (parents) {
struct commit *cmit = pop_commit(&parents);

View File

@ -57,7 +57,7 @@ static int handle_independent(int count, const char **args)
for (i = count - 1; i >= 0; i--)
commit_list_insert(get_commit_reference(args[i]), &revs);
revs = reduce_heads(revs);
reduce_heads_replace(&revs);
if (!revs)
return 1;
@ -78,7 +78,9 @@ static int handle_octopus(int count, const char **args, int show_all)
for (i = count - 1; i >= 0; i--)
commit_list_insert(get_commit_reference(args[i]), &revs);
result = reduce_heads(get_octopus_merge_bases(revs));
result = get_octopus_merge_bases(revs);
free_commit_list(revs);
reduce_heads_replace(&result);
if (!result)
return 1;

View File

@ -999,6 +999,7 @@ static struct commit_list *reduce_parents(struct commit *head_commit,
/* Find what parents to record by checking independent ones. */
parents = reduce_heads(remoteheads);
free_commit_list(remoteheads);
remoteheads = NULL;
remotes = &remoteheads;

View File

@ -745,12 +745,15 @@ static int get_octopus_merge_base(struct object_id *merge_base,
if (!is_null_oid(fork_point))
commit_list_insert(lookup_commit_reference(fork_point), &revs);
result = reduce_heads(get_octopus_merge_bases(revs));
result = get_octopus_merge_bases(revs);
free_commit_list(revs);
reduce_heads_replace(&result);
if (!result)
return 1;
oidcpy(merge_base, &result->item->object.oid);
free_commit_list(result);
return 0;
}

View File

@ -1090,6 +1090,13 @@ struct commit_list *reduce_heads(struct commit_list *heads)
return result;
}
void reduce_heads_replace(struct commit_list **heads)
{
struct commit_list *result = reduce_heads(*heads);
free_commit_list(*heads);
*heads = result;
}
static const char gpg_sig_header[] = "gpgsig";
static const int gpg_sig_header_len = sizeof(gpg_sig_header) - 1;

View File

@ -313,7 +313,23 @@ extern int interactive_add(int argc, const char **argv, const char *prefix, int
extern int run_add_interactive(const char *revision, const char *patch_mode,
const struct pathspec *pathspec);
struct commit_list *reduce_heads(struct commit_list *heads);
/*
* Takes a list of commits and returns a new list where those
* have been removed that can be reached from other commits in
* the list. It is useful for, e.g., reducing the commits
* randomly thrown at the git-merge command and removing
* redundant commits that the user shouldn't have given to it.
*
* This function destroys the STALE bit of the commit objects'
* flags.
*/
extern struct commit_list *reduce_heads(struct commit_list *heads);
/*
* Like `reduce_heads()`, except it replaces the list. Use this
* instead of `foo = reduce_heads(foo);` to avoid memory leaks.
*/
extern void reduce_heads_replace(struct commit_list **heads);
struct commit_extra_header {
struct commit_extra_header *next;