From c5bcf1f9f6d3429ab9a09e07e28362e7d189005b Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 6 Jul 2011 15:14:43 -0700 Subject: [PATCH] checkout: do not write bogus reflog entry out As resolve_ref() returns a static buffer that is local to the function, the caller needs to be sure that it will not have any other calls to the function before it uses the returned value, or store it away with a strdup(). The code used old.path to record which branch it used to be on, so that it can say between which branches the switch took place in the reflog, but sometimes it failed to do so. Signed-off-by: Junio C Hamano --- builtin-checkout.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/builtin-checkout.c b/builtin-checkout.c index 59a0ef4ec9..141a9e1873 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -342,10 +342,12 @@ static int switch_branches(struct checkout_opts *opts, unsigned char rev[20]; int flag; memset(&old, 0, sizeof(old)); - old.path = resolve_ref("HEAD", rev, 0, &flag); + old.path = xstrdup(resolve_ref("HEAD", rev, 0, &flag)); old.commit = lookup_commit_reference_gently(rev, 1); - if (!(flag & REF_ISSYMREF)) + if (!(flag & REF_ISSYMREF)) { + free((char *)old.path); old.path = NULL; + } if (old.path && !prefixcmp(old.path, "refs/heads/")) old.name = old.path + strlen("refs/heads/"); @@ -381,7 +383,7 @@ static int switch_branches(struct checkout_opts *opts, return ret; update_refs_for_switch(opts, &old, new); - + free((char *)old.path); return post_checkout_hook(old.commit, new->commit, 1); } -- 2.11.4.GIT