Skip to content

Commit 96b9e0e

Browse files
jrngitster
authored andcommitted
config: treat user and xdg config permission problems as errors
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e5c52c9 commit 96b9e0e

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

config.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -945,12 +945,12 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
945945
found += 1;
946946
}
947947

948-
if (xdg_config && !access_or_warn(xdg_config, R_OK)) {
948+
if (xdg_config && !access_or_die(xdg_config, R_OK)) {
949949
ret += git_config_from_file(fn, xdg_config, data);
950950
found += 1;
951951
}
952952

953-
if (user_config && !access_or_warn(user_config, R_OK)) {
953+
if (user_config && !access_or_die(user_config, R_OK)) {
954954
ret += git_config_from_file(fn, user_config, data);
955955
found += 1;
956956
}

git-compat-util.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ int remove_or_warn(unsigned int mode, const char *path);
609609
* (ENOENT or ENOTDIR).
610610
*/
611611
int access_or_warn(const char *path, int mode);
612+
int access_or_die(const char *path, int mode);
612613

613614
/* Warn on an inaccessible file that ought to be accessible */
614615
void warn_on_inaccessible(const char *path);

wrapper.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,14 @@ int access_or_warn(const char *path, int mode)
416416
return ret;
417417
}
418418

419+
int access_or_die(const char *path, int mode)
420+
{
421+
int ret = access(path, mode);
422+
if (ret && errno != ENOENT && errno != ENOTDIR)
423+
die_errno(_("unable to access '%s'"), path);
424+
return ret;
425+
}
426+
419427
struct passwd *xgetpwuid_self(void)
420428
{
421429
struct passwd *pw;

0 commit comments

Comments
 (0)