Skip to content

Commit

Permalink
Merge branch 'jn/config-ignore-inaccessible' into maint
Browse files Browse the repository at this point in the history
A git daemon that starts as "root" and then drops privilege often
leaves $HOME set to that of the root user, which is unreadable by
the daemon process, which was diagnosed as a configuration error.

Make per-user configuration files that are inaccessible due to
EACCES as though these files do not exist to avoid this issue, as
the tightening which was originally meant as an additional security
has annoyed enough sysadmins.

* jn/config-ignore-inaccessible:
  config: allow inaccessible configuration under $HOME
  • Loading branch information
Junio C Hamano committed Jun 10, 2013
2 parents fd50030 + 4698c8f commit b1c418e
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 15 deletions.
4 changes: 2 additions & 2 deletions builtin/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
*/
die("$HOME not set");

if (access_or_warn(user_config, R_OK) &&
xdg_config && !access_or_warn(xdg_config, R_OK))
if (access_or_warn(user_config, R_OK, 0) &&
xdg_config && !access_or_warn(xdg_config, R_OK, 0))
given_config_file = xdg_config;
else
given_config_file = user_config;
Expand Down
10 changes: 5 additions & 5 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc
path = buf.buf;
}

if (!access_or_die(path, R_OK)) {
if (!access_or_die(path, R_OK, 0)) {
if (++inc->depth > MAX_INCLUDE_DEPTH)
die(include_depth_advice, MAX_INCLUDE_DEPTH, path,
cf && cf->name ? cf->name : "the command line");
Expand Down Expand Up @@ -954,23 +954,23 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)

home_config_paths(&user_config, &xdg_config, "config");

if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK)) {
if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
ret += git_config_from_file(fn, git_etc_gitconfig(),
data);
found += 1;
}

if (xdg_config && !access_or_die(xdg_config, R_OK)) {
if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) {
ret += git_config_from_file(fn, xdg_config, data);
found += 1;
}

if (user_config && !access_or_die(user_config, R_OK)) {
if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) {
ret += git_config_from_file(fn, user_config, data);
found += 1;
}

if (repo_config && !access_or_die(repo_config, R_OK)) {
if (repo_config && !access_or_die(repo_config, R_OK, 0)) {
ret += git_config_from_file(fn, repo_config, data);
found += 1;
}
Expand Down
4 changes: 2 additions & 2 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1545,9 +1545,9 @@ void setup_standard_excludes(struct dir_struct *dir)
home_config_paths(NULL, &xdg_path, "ignore");
excludes_file = xdg_path;
}
if (!access_or_warn(path, R_OK))
if (!access_or_warn(path, R_OK, 0))
add_excludes_from_file(dir, path);
if (excludes_file && !access_or_warn(excludes_file, R_OK))
if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
add_excludes_from_file(dir, excludes_file);
}

Expand Down
5 changes: 3 additions & 2 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -692,8 +692,9 @@ int remove_or_warn(unsigned int mode, const char *path);
* Call access(2), but warn for any error except "missing file"
* (ENOENT or ENOTDIR).
*/
int access_or_warn(const char *path, int mode);
int access_or_die(const char *path, int mode);
#define ACCESS_EACCES_OK (1U << 0)
int access_or_warn(const char *path, int mode, unsigned flag);
int access_or_die(const char *path, int mode, unsigned flag);

/* Warn on an inaccessible file that ought to be accessible */
void warn_on_inaccessible(const char *path);
Expand Down
14 changes: 10 additions & 4 deletions wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,18 +408,24 @@ void warn_on_inaccessible(const char *path)
warning(_("unable to access '%s': %s"), path, strerror(errno));
}

int access_or_warn(const char *path, int mode)
static int access_error_is_ok(int err, unsigned flag)
{
return err == ENOENT || err == ENOTDIR ||
((flag & ACCESS_EACCES_OK) && err == EACCES);
}

int access_or_warn(const char *path, int mode, unsigned flag)
{
int ret = access(path, mode);
if (ret && errno != ENOENT && errno != ENOTDIR)
if (ret && !access_error_is_ok(errno, flag))
warn_on_inaccessible(path);
return ret;
}

int access_or_die(const char *path, int mode)
int access_or_die(const char *path, int mode, unsigned flag)
{
int ret = access(path, mode);
if (ret && errno != ENOENT && errno != ENOTDIR)
if (ret && !access_error_is_ok(errno, flag))
die_errno(_("unable to access '%s'"), path);
return ret;
}
Expand Down

0 comments on commit b1c418e

Please sign in to comment.