lock_ref_sha1(): check D/F conflict with packed ref when creating.
This makes the ref locking codepath to notice if an existing ref overlaps with the ref we are creating. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
5cc3cef997
commit
22a3844eba
24
refs.c
24
refs.c
@ -588,6 +588,30 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
|
||||
orig_ref, strerror(errno));
|
||||
goto error_return;
|
||||
}
|
||||
if (is_null_sha1(lock->old_sha1)) {
|
||||
/* The ref did not exist and we are creating it.
|
||||
* Make sure there is no existing ref that is packed
|
||||
* whose name begins with our refname, nor a ref whose
|
||||
* name is a proper prefix of our refname.
|
||||
*/
|
||||
int namlen = strlen(ref); /* e.g. 'foo/bar' */
|
||||
struct ref_list *list = get_packed_refs();
|
||||
while (list) {
|
||||
/* list->name could be 'foo' or 'foo/bar/baz' */
|
||||
int len = strlen(list->name);
|
||||
int cmplen = (namlen < len) ? namlen : len;
|
||||
const char *lead = (namlen < len) ? list->name : ref;
|
||||
|
||||
if (!strncmp(ref, list->name, cmplen) &&
|
||||
lead[cmplen] == '/') {
|
||||
error("'%s' exists; cannot create '%s'",
|
||||
list->name, ref);
|
||||
goto error_return;
|
||||
}
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
|
||||
lock->lk = xcalloc(1, sizeof(struct lock_file));
|
||||
|
||||
lock->ref_name = xstrdup(ref);
|
||||
|
Loading…
Reference in New Issue
Block a user