From: Nguyen Thai Ngoc Duy Date: Sun, 11 Dec 2011 09:46:10 GMT Subject: Re: [PATCH 3/3] Rename resolve_ref() to resolve_ref_unsafe() Message-ID: In-Reply-To: <20111210205519.GA24817@elie.hsd1.il.comcast.net> 2011/12/11 Jonathan Nieder : > 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