From: Junio C Hamano <gitster@pobox.com>
To: "Martin Ågren" <martin.agren@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] reduce_heads: fix memory leaks
Date: Thu, 02 Nov 2017 12:11:38 +0900 [thread overview]
Message-ID: <xmqq7ev9s7bp.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20171101090326.8091-1-martin.agren@gmail.com> ("Martin Ågren"'s message of "Wed, 1 Nov 2017 10:03:26 +0100")
Martin Ågren <martin.agren@gmail.com> writes:
> diff --git a/builtin/merge-base.c b/builtin/merge-base.c
> index 6dbd167d3..b1b7590c4 100644
> --- a/builtin/merge-base.c
> +++ b/builtin/merge-base.c
> @@ -59,6 +59,8 @@ static int handle_independent(int count, const char **args)
> commit_list_insert(get_commit_reference(args[i]), &revs);
>
> result = reduce_heads(revs);
> + free_commit_list(revs);
> +
> if (!result)
> return 1;
The post-context of this hunk continues like so:
while (result) {
printf("%s\n", oid_to_hex(&result->item->object.oid));
result = result->next;
}
return 0;
}
and we end up leaking "result". This function is directly called from
cmd_merge_base() and its value is returned to main(), so leaking it
is not that a grave offence, but that excuse applies equally well to
revs.
I can see you are shooting for minimum change in this patch, but if
we were writing this code in a codebase where reduce_heads_replace()
is already available, I would imagine that we wouldn't use two separate
variables, perhaps?
> diff --git a/commit.c b/commit.c
> index 1e0e63379..cab8d4455 100644
> --- a/commit.c
> +++ b/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;
> +}
> +
Looks good.
> diff --git a/commit.h b/commit.h
> index 6d769590f..99a3fea68 100644
> --- a/commit.h
> +++ b/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);
Looks excellent.
Thanks.
next prev parent reply other threads:[~2017-11-02 3:11 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-01 9:03 [PATCH] reduce_heads: fix memory leaks Martin Ågren
2017-11-02 3:11 ` Junio C Hamano [this message]
2017-11-02 10:45 ` Martin Ågren
2017-11-05 20:26 ` [PATCH v2 0/2] " Martin Ågren
2017-11-05 20:26 ` [PATCH v2 1/2] builtin/merge-base: UNLEAK commit lists Martin Ågren
2017-11-06 1:03 ` Junio C Hamano
2017-11-06 11:05 ` Jeff King
2017-11-07 20:39 ` [PATCH v3 1/2] builtin/merge-base: free " Martin Ågren
2017-11-08 2:40 ` Junio C Hamano
2017-11-07 20:39 ` [PATCH v3 2/2] reduce_heads: fix memory leaks Martin Ågren
2017-11-05 20:26 ` [PATCH v2 " Martin Ågren
2017-11-06 1:12 ` [PATCH v2 0/2] " Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq7ev9s7bp.fsf@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=martin.agren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.