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? [...] > +++ b/transport.c > @@ -163,7 +163,7 @@ static void set_upstreams(struct transport *transport, struct ref *refs, > /* Follow symbolic refs (mainly for HEAD). */ > localname = ref->peer_ref->name; > remotename = ref->name; > - tmp = resolve_ref(localname, sha, 1, &flag); > + tmp = resolve_ref_unsafe(localname, sha, 1, &flag); Anyway, this patch looks sane. The reminder seems useful and doesn't feel over-the-top. -- 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