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

[PATCH 2/2] config: treat user and xdg config permission problems as errors

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Oct 14, 2012, 00:04 UTC
Message-ID
<20121014000402.GB11399@elie.Belkin>
In-Reply-To
<20121014000210.GA19094@elie.Belkin>

Git reads multiple configuration files: settings come first from the system config file (typically /etc/gitconfig), then the xdg config file (typically ~/.config/git/config), then the user's dotfile (~/.gitconfig), then the repository configuration (.git/config).

Git has always used access(2) to decide whether to use each file; as an unfortunate side effect, that means that if one of these files is unreadable (e.g., EPERM or EIO), git skips it. So if I use ~/.gitconfig to override some settings but make a mistake and give it the wrong permissions then I am subject to the settings the sysadmin chose for /etc/gitconfig.

Better to error out and ask the user to correct the problem.

This only affects the user and xdg config files, since the user presumably has enough access to fix their permissions. If the system config file is unreadable, the best we can do is to warn about it so the user knows to notify someone and get on with work in the meantime.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 config.c          | 4 ++--
 git-compat-util.h | 1 +
 wrapper.c         | 8 ++++++++
 3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/config.c b/config.c
index 08e47e2e..e8875b8a 100644
--- a/config.c
+++ b/config.c
@@ -945,12 +945,12 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
 		found += 1;
 	}
 
-	if (xdg_config && !access_or_warn(xdg_config, R_OK)) {
+	if (xdg_config && !access_or_die(xdg_config, R_OK)) {
 		ret += git_config_from_file(fn, xdg_config, data);
 		found += 1;
 	}
 
-	if (user_config && !access_or_warn(user_config, R_OK)) {
+	if (user_config && !access_or_die(user_config, R_OK)) {
 		ret += git_config_from_file(fn, user_config, data);
 		found += 1;
 	}
diff --git a/git-compat-util.h b/git-compat-util.h
index f567767f..dfe2e318 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -640,6 +640,7 @@ int remove_or_warn(unsigned int mode, const char *path);
  * (ENOENT or ENOTDIR).
  */
 int access_or_warn(const char *path, int mode);
+int access_or_die(const char *path, int mode);
 
 /* Warn on an inaccessible file that ought to be accessible */
 void warn_on_inaccessible(const char *path);
diff --git a/wrapper.c b/wrapper.c
index c1b919f3..7cbe96a0 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -416,6 +416,14 @@ int access_or_warn(const char *path, int mode)
 	return ret;
 }
 
+int access_or_die(const char *path, int mode)
+{
+	int ret = access(path, mode);
+	if (ret && errno != ENOENT && errno != ENOTDIR)
+		die_errno(_("unable to access '%s'"), path);
+	return ret;
+}
+
 struct passwd *xgetpwuid_self(void)
 {
 	struct passwd *pw;
-- 
1.8.0.rc2
Previous: Jonathan NiederNext: Jeff King
Message 3 of 13 in “Re: [PATCH] config: warn on inaccessible files”
  1. 0/2 Re: [PATCH] config: warn on inaccessible filesJonathan Nieder, Oct 14, 2012
  2. 1/2 config, gitignore: failure to access with ENOTDIR is okJonathan Nieder, Oct 14, 2012
  3. 2/2 config: treat user and xdg config permission problems as errorsJonathan Nieder, Oct 14, 2012
  4. Jeff KingOct 14, 2012
  5. Jonathan NiederOct 14, 2012
  6. 3/2 config doc: advertise GIT_CONFIG_NOSYSTEMJonathan Nieder, Oct 14, 2012
  7. 3/2 doc: advertise GIT_CONFIG_NOSYSTEMJonathan Nieder, Oct 14, 2012
  8. 4/2 config: exit on error accessing any config fileJonathan Nieder, Oct 14, 2012
  9. Jeff KingOct 14, 2012
  10. Junio C HamanoOct 14, 2012
  11. Jeff KingOct 14, 2012
  12. Jonathan NiederOct 14, 2012
  13. Jeff KingOct 14, 2012

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.