summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-07-06 15:14:43 -0700
committerJunio C Hamano <gitster@pobox.com>2011-07-06 15:15:02 -0700
commitc5bcf1f9f6d3429ab9a09e07e28362e7d189005b (patch)
tree950431539a344a0fd912b4c212f3628676a0e44d
parent782c2d65c24066a5d83453efb52763bc34c10f81 (diff)
downloadgit-c5bcf1f9f6d3429ab9a09e07e28362e7d189005b.tar.gz
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 <gitster@pobox.com>
-rw-r--r--builtin-checkout.c8
1 files 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);
}