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

[PATCH 3/3] validate_headref: use get_oid_hex for detached HEADs

From
Jeff King <peff@peff.net>
Date
Sep 27, 2017, 06:17 UTC
Message-ID
<20170927061736.reeavh5r3tyqovbc@sigill.intra.peff.net>
In-Reply-To
<20170927061644.gwlhxaiairiy2njp@sigill.intra.peff.net>

If a candidate HEAD isn't a symref, we check that it contains a viable sha1. But in a post-sha1 world, we should be checking whether it has any plausible object-id.

We can do that by switching to get_oid_hex().

Note that both before and after this patch, we only check for a plausible object id at the start of the file, and then call that good enough. We ignore any content _after_ the hex, so a string like:

  0123456789012345678901234567890123456789 foo

is accepted. Though we do put extra bytes like this into some pseudorefs (e.g., FETCH_HEAD), we don't typically do so with HEAD. We could tighten this up by using parse_oid_hex(), like:

  if (!parse_oid_hex(buffer, &oid, &end) &&
      *end++ == '\n' && *end == '\0')
          return 0;

But we're probably better to remain on the loose side. We're just checking here for a plausible-looking repository directory, so heuristics are acceptable (if we really want to be meticulous, we should use the actual ref code to parse HEAD).

Signed-off-by: Jeff King <peff@peff.net>
---
 path.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/path.c b/path.c
index 2ef3a86613..5aa9244eb2 100644
--- a/path.c
+++ b/path.c
@@ -639,7 +639,7 @@ int validate_headref(const char *path)
 	struct stat st;
 	char buffer[256];
 	const char *refname;
-	unsigned char sha1[20];
+	struct object_id oid;
 	int fd;
 	ssize_t len;
 
@@ -680,7 +680,7 @@ int validate_headref(const char *path)
 	/*
 	 * Is this a detached HEAD?
 	 */
-	if (!get_sha1_hex(buffer, sha1))
+	if (!get_oid_hex(buffer, &oid))
 		return 0;
 
 	return -1;
-- 
2.14.2.988.g01c8b37dde
Previous: Junio C Hamano
Message 8 of 8 in “validate_headref: avoid reading uninitialized bytes”
  1. 0/3 validate_headref: avoid reading uninitialized bytesJeff King, Sep 27, 2017
  2. 1/3 validate_headref: NUL-terminate HEAD bufferJeff King, Sep 27, 2017
  3. Junio C HamanoSep 27, 2017
  4. Jeff KingSep 27, 2017
  5. Junio C HamanoSep 27, 2017
  6. 2/3 validate_headref: use skip_prefix for symref parsingJeff King, Sep 27, 2017
  7. Junio C HamanoSep 27, 2017
  8. 3/3 validate_headref: use get_oid_hex for detached HEADsJeff King, Sep 27, 2017

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.