[PATCH 07/19] refs.c: move the check for valid refname to lock_ref_sha1_basic
flat view
STALE3772d
From: Jonathan Nieder <hidden>
Date: 2016-06-15 23:02:29
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Ronnie Sahlberg <redacted> Date: Thu, 1 May 2014 10:40:10 -0700 Move the check for check_refname_format from lock_any_ref_for_update to lock_ref_sha1_basic. At some later stage we will get rid of lock_any_ref_for_update completely. This has no visible impact to callers, except for inability to lock badly named refs which is not possible today anyway but for other reasons. Keep lock_any_ref_for_update as a no-op wrapper --- it is the public facing version of this interface and keeping it as a separate function will make it easier to experiment with the internal lock_ref_sha1_basic signature. Note that if lock_ref_sha1_basic now checks the refname format and fails to lock the ref it will not be possible to delete such a ref since deletion implies we first lock the ref. In fact, we currently fail even earlier than that since these refs are not even recognized to exist. Example: $ cp .git/refs/heads/master .git/refs/heads/echo...\*\* $ ./git branch -D .git/refs/heads/echo...\*\* error: branch '.git/refs/heads/echo...**' not found. This is not a new regression and this has been broken for a while. Later patches in the series will start repairing the handling of badly named refs, at which time we will need to modify lock_ref_sha1_basic once more in order to allow locking these refs for certain use cases such as rename and delete. Signed-off-by: Ronnie Sahlberg <redacted> Signed-off-by: Jonathan Nieder <redacted> --- refs.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/refs.c b/refs.c
index 39571f5..3c2ce57 100644
--- a/refs.c
+++ b/refs.c@@ -2091,6 +2091,11 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, int missing = 0; int attempts_remaining = 3; + if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { + errno = EINVAL; + return NULL; + } + lock = xcalloc(1, sizeof(struct ref_lock)); lock->lock_fd = -1;
@@ -2182,8 +2187,6 @@ struct ref_lock *lock_any_ref_for_update(const char *refname, const unsigned char *old_sha1, int flags, int *type_p) { - if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) - return NULL; return lock_ref_sha1_basic(refname, old_sha1, flags, type_p); }
--
2.1.0.rc2.206.gedb03e5