On Wed, Oct 15, 2008 at 02:24:47PM -0400, Matt Draisey wrote: > If HEAD is a symlink rather than a "ref:" style link this is really > bad. Hmm. I don't think we have shipped with a symlink HEAD for quite a long time. Using one obviously doesn't work with detached HEAD, but also would fail with packed refs. I don't know if we ever deprecated it. Still, this is a pretty nasty effect, in that it kills whatever was in the existing ref. There is a fix below which refuses to lock any ref if it is a symlink and we have requested not to dereference (actually, it is overly cautious -- the symlink flag is triggered when we see a symlink anywhere in the chain, though we need only prevent the situation when the _first_ symref is a symlink. I don't know if it is worth differentiating, since they are both "should never happen anymore" situations, I think). --- diff --git a/refs.c b/refs.c index b680750..43568e7 100644 --- a/refs.c +++ b/refs.c @@ -447,7 +447,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * strcpy(ref_buffer, buffer); ref = ref_buffer; if (flag) - *flag |= REF_ISSYMREF; + *flag |= REF_ISSYMREF | REF_ISSYMLINK; continue; } } @@ -817,6 +817,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char } ref = resolve_ref(orig_ref, lock->old_sha1, mustexist, &type); } + if (type & REF_ISSYMLINK && flags & REF_NODEREF) { + error("unable to directly lock symbolic link '%s'", orig_ref); + goto error_return; + } if (type_p) *type_p = type; if (!ref) { diff --git a/refs.h b/refs.h index 06ad260..6356a6a 100644 --- a/refs.h +++ b/refs.h @@ -12,6 +12,7 @@ struct ref_lock { #define REF_ISSYMREF 01 #define REF_ISPACKED 02 +#define REF_ISSYMLINK 04 /* * Calls the specified function for each ref file until it returns nonzero, -- 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