Message ID | 32a0a2d6-3237-24e9-c647-6624cc2a1e89@web.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | name-rev: improve memory usage | expand |
On 2/4/2020 4:17 PM, René Scharfe wrote: > 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. > 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
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); 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); } return 0; }
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(-) -- 2.25.0