Jeff King <peff@xxxxxxxx> writes: > If $GITHEAD_1234abcd is set in the environment, we use its value as a > "better branch name" in generating conflict markers. However, we pick > these better names early in the process, and the return value from > getenv() is not guaranteed to stay valid. > > Let's make a copy of the returned string. And to make memory management > easier, let's just always return an allocated string from > better_branch_name(), so we know that it must always be freed. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > builtin/merge-recursive.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) Thanks. Will queue. > > diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c > index 9b2f707c29..7545136c2a 100644 > --- a/builtin/merge-recursive.c > +++ b/builtin/merge-recursive.c > @@ -7,16 +7,16 @@ > static const char builtin_merge_recursive_usage[] = > "git %s <base>... -- <head> <remote> ..."; > > -static const char *better_branch_name(const char *branch) > +static char *better_branch_name(const char *branch) > { > static char githead_env[8 + GIT_MAX_HEXSZ + 1]; > char *name; > > if (strlen(branch) != the_hash_algo->hexsz) > - return branch; > + return xstrdup(branch); > xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch); > name = getenv(githead_env); > - return name ? name : branch; > + return xstrdup(name ? name : branch); > } > > int cmd_merge_recursive(int argc, const char **argv, const char *prefix) > @@ -26,6 +26,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix) > int i, failed; > struct object_id h1, h2; > struct merge_options o; > + char *better1, *better2; > struct commit *result; > > init_merge_options(&o); > @@ -70,13 +71,17 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix) > if (get_oid(o.branch2, &h2)) > die(_("could not resolve ref '%s'"), o.branch2); > > - o.branch1 = better_branch_name(o.branch1); > - o.branch2 = better_branch_name(o.branch2); > + o.branch1 = better1 = better_branch_name(o.branch1); > + o.branch2 = better2 = better_branch_name(o.branch2); > > if (o.verbosity >= 3) > printf(_("Merging %s with %s\n"), o.branch1, o.branch2); > > failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result); > + > + free(better1); > + free(better2); > + > if (failed < 0) > return 128; /* die() error code */ > return failed;