Re: [PATCH 04/10] name-rev: don't leak path copy in name_ref()
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Feb 5, 2020, 14:35 UTC
- Message-ID
- <1cced7f0-8112-1ed9-b25d-e559a17a3cc0@gmail.com>
- In-Reply-To
- <32a0a2d6-3237-24e9-c647-6624cc2a1e89@web.de>
On 2/4/2020 4:17 PM, René Scharfe wrote:
Show 20 quoted lines
> name_ref() duplicates the path string and passes it to name_rev(), which
> either puts it into a commit slab or ignores it if there is already a
> better name, leaking it. Move the duplication to name_rev() and release
> the copy in the latter case.
>
> Signed-off-by: René Scharfe <l.s.r@web.de>
> ---
> builtin/name-rev.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/builtin/name-rev.c b/builtin/name-rev.c
> index 2e6820bd5b..3e22a0503e 100644
> --- a/builtin/name-rev.c
> +++ b/builtin/name-rev.c
> @@ -121,6 +121,8 @@ static void name_rev(struct commit *start_commit,
>
> if (deref)
> tip_name = to_free = xstrfmt("%s^0", tip_name);
> + else
> + tip_name = to_free = xstrdup(tip_name);We now unconditionally duplicate the input tip_name and free it within the method. Good.
Show 8 quoted lines
> if (!create_or_update_name(start_commit, tip_name, taggerdate, 0, 0,
> from_tag)) {
> @@ -323,7 +325,7 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
> if (taggerdate == TIME_MAX)
> taggerdate = commit->date;
> path = name_ref_abbrev(path, can_abbreviate_output);
> - name_rev(commit, xstrdup(path), taggerdate, from_tag, deref);
> + name_rev(commit, path, taggerdate, from_tag, deref);And we no longer duplicate 'path' here, as it is unconditionally duplicated in name_ref().
Thanks, -Stolee