When creating a stash, Git builds the stash commit message using the current branch name of the superproject. However, in repositories that include submodules, the stash message may incorrectly show the submodule branch instead of the superproject. This happens because `branch_name` is obtained via `refs_resolve_ref_unsafe()`, which returns a pointer to a static buffer. Later calls to the same function (e.g., during commit creation or submodule reference resolution) overwrite this buffer, causing the `branch_name` used in the final stash message to be incorrect. Reported-by: Stuart <smacdonald@xxxxxxxxxxxxx> Signed-off-by: K Jayatheerth <jayatheerthkulkarni2005@xxxxxxxxx> --- builtin/stash.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/builtin/stash.c b/builtin/stash.c index cfbd92852a..6a375a3430 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1377,6 +1377,7 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b struct strbuf msg = STRBUF_INIT; struct strbuf commit_tree_label = STRBUF_INIT; struct strbuf untracked_files = STRBUF_INIT; + char *branch_name_buf = NULL; prepare_fallback_ident("git stash", "git@stash"); @@ -1404,11 +1405,20 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b branch_ref = refs_resolve_ref_unsafe(get_main_ref_store(the_repository), "HEAD", 0, NULL, &flags); - if (flags & REF_ISSYMREF) - skip_prefix(branch_ref, "refs/heads/", &branch_name); - head_short_sha1 = repo_find_unique_abbrev(the_repository, - &head_commit->object.oid, - DEFAULT_ABBREV); + + if (flags & REF_ISSYMREF) { + const char *tmp = NULL; + if (skip_prefix(branch_ref, "refs/heads/", &tmp)) + branch_name_buf = xstrdup(tmp); + } + if (branch_name_buf) + branch_name = branch_name_buf; + else + branch_name = "(no branch)"; + + head_short_sha1 = repo_find_unique_abbrev(the_repository, + &head_commit->object.oid, + DEFAULT_ABBREV); strbuf_addf(&msg, "%s: %s ", branch_name, head_short_sha1); pp_commit_easy(CMIT_FMT_ONELINE, head_commit, &msg); -- 2.49.GIT