зеркало из https://github.com/microsoft/git.git
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:
Родитель
a452d0f4ba
Коммит
4da72644b7
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
7
commit.c
7
commit.c
|
@ -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;
|
||||
|
||||
|
|
18
commit.h
18
commit.h
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче