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

[PATCH 1/3] credential-cache--daemon: refactor check_socket_directory

From
Jeff King <peff@peff.net>
Date
Feb 23, 2016, 07:15 UTC
Message-ID
<20160223071515.GA8395@sigill.intra.peff.net>
In-Reply-To
<20160223071427.GA7489@sigill.intra.peff.net>
From: Jon Griffiths <jon_p_griffiths@yahoo.com>

This function does an early return, and therefore has to repeat its cleanup. We can stick the later bit of the function into an "else" and avoid duplicating the shared part (which will get bigger in a future patch).

Let's also rename the function to init_socket_directory. It not only checks the directory but also creates it. Saying "init" is more accurate.

Signed-off-by: Jon Griffiths <jon_p_griffiths@yahoo.com>
Signed-off-by: Jeff King <peff@peff.net>
---
 credential-cache--daemon.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)
diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c
index cc65a9c..3403f48 100644
--- a/credential-cache--daemon.c
+++ b/credential-cache--daemon.c
@@ -215,7 +215,7 @@ static const char permissions_advice[] =
 "users may be able to read your cached credentials. Consider running:\n"
 "\n"
 "	chmod 0700 %s";
-static void check_socket_directory(const char *path)
+static void init_socket_directory(const char *path)
 {
 	struct stat st;
 	char *path_copy = xstrdup(path);
@@ -224,20 +224,18 @@ static void check_socket_directory(const char *path)
 	if (!stat(dir, &st)) {
 		if (st.st_mode & 077)
 			die(permissions_advice, dir);
-		free(path_copy);
-		return;
+	} else {
+		/*
+		 * We must be sure to create the directory with the correct mode,
+		 * not just chmod it after the fact; otherwise, there is a race
+		 * condition in which somebody can chdir to it, sleep, then try to open
+		 * our protected socket.
+		 */
+		if (safe_create_leading_directories_const(dir) < 0)
+			die_errno("unable to create directories for '%s'", dir);
+		if (mkdir(dir, 0700) < 0)
+			die_errno("unable to mkdir '%s'", dir);
 	}
-
-	/*
-	 * We must be sure to create the directory with the correct mode,
-	 * not just chmod it after the fact; otherwise, there is a race
-	 * condition in which somebody can chdir to it, sleep, then try to open
-	 * our protected socket.
-	 */
-	if (safe_create_leading_directories_const(dir) < 0)
-		die_errno("unable to create directories for '%s'", dir);
-	if (mkdir(dir, 0700) < 0)
-		die_errno("unable to mkdir '%s'", dir);
 	free(path_copy);
 }
 
@@ -264,7 +262,7 @@ int main(int argc, const char **argv)
 	if (!socket_path)
 		usage_with_options(usage, options);
 
-	check_socket_directory(socket_path);
+	init_socket_directory(socket_path);
 	register_tempfile(&socket_file, socket_path);
 
 	if (ignore_sighup)
-- 
2.7.2.645.g4e1306c
Previous: Jeff KingNext: Jeff King
Message 2 of 8 in “credential-cache: give daemon a predictable cwd”
  1. 0/3 credential-cache: give daemon a predictable cwdJeff King, Feb 23, 2016
  2. 1/3 credential-cache--daemon: refactor check_socket_directoryJeff King, Feb 23, 2016
  3. 2/3 credential-cache--daemon: disallow relative socket pathJeff King, Feb 23, 2016
  4. 3/3 credential-cache--daemon: change to the socket dir on startupJeff King, Feb 23, 2016
  5. Junio C HamanoFeb 23, 2016
  6. Jeff KingFeb 23, 2016
  7. Junio C HamanoFeb 23, 2016
  8. Jeff KingFeb 23, 2016

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.