2011/12/11 Jonathan Nieder <jrnieder@xxxxxxxxx>: > Nguyễn Thái Ngọc Duy wrote: > >> resolve_ref() may return a pointer to a shared buffer and can be >> overwritten by the next resolve_ref() calls. Callers need to >> pay attention, not to keep the pointer when the next call happens. > [...] >> --- a/branch.c >> +++ b/branch.c >> @@ -182,7 +182,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref, >> const char *head; >> unsigned char sha1[20]; >> >> - head = resolve_ref("HEAD", sha1, 0, NULL); >> + head = resolve_ref_unsafe("HEAD", sha1, 0, NULL); > > I wonder if it would make sense to have a separate function that > maintains a shared buffer describing what HEAD resolves to, lazily > loaded. Would invalidating the cache when appropriate be too fussy > and subtle? If we do not execute "git update-ref" from git binary (bisect does, although on BISECT_HEAD, not HEAD) then it'd be safe to cache HEAD and invalidate it in update_ref(). -- Duy -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html