git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 08/25] refs.c: refuse to lock badly named refs in lock_ref_sha1_basic

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Oct 15, 2014, 00:49 UTC
Message-ID
<20141015004911.GL32245@google.com>
In-Reply-To
<20141015004522.GD32245@google.com>
From: Ronnie Sahlberg <sahlberg@google.com>
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 the inability to lock badly named refs, which is not possible today already 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.

(*) For example, if lock_ref_sha1_basic checks the refname format and refuses to lock badly named refs, it will not be possible to delete such refs because the first step of deletion is to lock the ref. We currently already fail in that case because these refs are not recognized to exist:

 $ 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 has been broken for a while. Later patches in the series will start repairing the handling of badly named refs.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Reviewed-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 refs.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/refs.c b/refs.c
index 3c45615..9c01623 100644
--- a/refs.c
+++ b/refs.c
@@ -2150,6 +2150,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;
 
@@ -2241,8 +2246,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
Previous: Jonathan NiederNext: Jonathan Nieder
Message 9 of 28 in “rs/ref-transaction ("Use ref transactions", part 3)”
  1. 0/25 rs/ref-transaction ("Use ref transactions", part 3)Jonathan Nieder, Oct 15, 2014
  2. 01/25 mv test: recreate mod/ directory instead of relying on stale copyJonathan Nieder, Oct 15, 2014
  3. 02/25 wrapper.c: remove/unlink_or_warn: simplify, treat ENOENT as successJonathan Nieder, Oct 15, 2014
  4. 03/25 refs.c: lock_ref_sha1_basic is used for all refsJonathan Nieder, Oct 15, 2014
  5. 04/25 wrapper.c: add a new function unlink_or_msgJonathan Nieder, Oct 15, 2014
  6. 05/25 refs.c: add an err argument to delete_ref_looseJonathan Nieder, Oct 15, 2014
  7. 06/25 refs.c: pass the ref log message to _create/delete/update instead of _commitJonathan Nieder, Oct 15, 2014
  8. 07/25 rename_ref: don't ask read_ref_full where the ref came fromJonathan Nieder, Oct 15, 2014
  9. 08/25 refs.c: refuse to lock badly named refs in lock_ref_sha1_basicJonathan Nieder, Oct 15, 2014
  10. 09/25 refs.c: call lock_ref_sha1_basic directly from commitJonathan Nieder, Oct 15, 2014
  11. 10/25 refs.c: pass a list of names to skip to is_refname_availableJonathan Nieder, Oct 15, 2014
  12. 11/25 refs.c: ref_transaction_commit: distinguish name conflicts from other errorsJonathan Nieder, Oct 15, 2014
  13. 12/25 fetch.c: change s_update_ref to use a ref transactionJonathan Nieder, Oct 15, 2014
  14. 13/25 refs.c: make write_ref_sha1 staticJonathan Nieder, Oct 15, 2014
  15. 14/25 refs.c: change resolve_ref_unsafe reading argument to be a flags fieldJonathan Nieder, Oct 15, 2014
  16. 15/25 reflog test: test interaction with detached HEADJonathan Nieder, Oct 15, 2014
  17. 16/25 branch -d: avoid repeated symref resolutionJonathan Nieder, Oct 15, 2014
  18. 17/25 branch -d: simplify by using RESOLVE_REF_READINGJonathan Nieder, Oct 15, 2014
  19. 18/25 packed-ref cache: forbid dot-components in refnamesJonathan Nieder, Oct 15, 2014
  20. 19/25 test: put tests for handling of bad ref names in one placeJonathan Nieder, Oct 15, 2014
  21. 20/25 refs.c: allow listing and deleting badly named refsJonathan Nieder, Oct 15, 2014
  22. 21/25 for-each-ref: skip and warn about broken ref namesJonathan Nieder, Oct 15, 2014
  23. 22/25 remote rm/prune: print a message when writing packed-refs failsJonathan Nieder, Oct 15, 2014
  24. 23/25 refs.c: do not permit err == NULLJonathan Nieder, Oct 15, 2014
  25. 24/25 lockfile: remove unable_to_lock_errorJonathan Nieder, Oct 15, 2014
  26. 25/25 ref_transaction_commit: bail out on failure to remove a refJonathan Nieder, Oct 15, 2014
  27. Junio C HamanoOct 15, 2014
  28. Michael HaggertyOct 16, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.