Skip to content

Commit

Permalink
Merge branch 'cc/access-on-aix-workaround'
Browse files Browse the repository at this point in the history
Workaround for standard-compliant but less-than-useful behaviour of
access(2) for the root user.

* cc/access-on-aix-workaround:
  git-compat-util: work around for access(X_OK) under root
  • Loading branch information
gitster committed May 13, 2019
2 parents b51a0fd 400caaf commit 40bef49
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 2 deletions.
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 439,9 @@ all::
#
# Define FILENO_IS_A_MACRO if fileno() is a macro, not a real function.
#
# Define NEED_ACCESS_ROOT_HANDLER if access() under root may success for X_OK
# even if execution permission isn't granted for any user.
#
# Define PAGER_ENV to a SP separated VAR=VAL pairs to define
# default environment variables to be passed when a pager is spawned, e.g.
#
Expand Down Expand Up @@ -1833,6 1836,11 @@ ifdef FILENO_IS_A_MACRO
COMPAT_OBJS = compat/fileno.o
endif

ifdef NEED_ACCESS_ROOT_HANDLER
COMPAT_CFLAGS = -DNEED_ACCESS_ROOT_HANDLER
COMPAT_OBJS = compat/access.o
endif

ifeq ($(TCLTK_PATH),)
NO_TCLTK = NoThanks
endif
Expand Down
31 changes: 31 additions & 0 deletions compat/access.c
Original file line number Diff line number Diff line change
@@ -0,0 1,31 @@
#define COMPAT_CODE_ACCESS
#include "../git-compat-util.h"

/* Do the same thing access(2) does, but use the effective uid,
* and don't make the mistake of telling root that any file is
* executable. This version uses stat(2).
*/
int git_access(const char *path, int mode)
{
struct stat st;

/* do not interfere a normal user */
if (geteuid())
return access(path, mode);

if (stat(path, &st) < 0)
return -1;

/* Root can read or write any file. */
if (!(mode & X_OK))
return 0;

/* Root can execute any file that has any one of the execute
* bits set.
*/
if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
return 0;

errno = EACCES;
return -1;
}
2 changes: 1 addition & 1 deletion compat/fileno.c
Original file line number Diff line number Diff line change
@@ -1,4 1,4 @@
#define COMPAT_CODE
#define COMPAT_CODE_FILENO
#include "../git-compat-util.h"

int git_fileno(FILE *stream)
Expand Down
1 change: 1 addition & 0 deletions config.mak.uname
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 272,7 @@ ifeq ($(uname_S),AIX)
NEEDS_LIBICONV = YesPlease
BASIC_CFLAGS = -D_LARGE_FILES
FILENO_IS_A_MACRO = UnfortunatelyYes
NEED_ACCESS_ROOT_HANDLER = UnfortunatelyYes
ifeq ($(shell expr "$(uname_V)" : '[1234]'),1)
NO_PTHREADS = YesPlease
else
Expand Down
12 changes: 11 additions & 1 deletion git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -1237,12 1237,22 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);

#ifdef FILENO_IS_A_MACRO
int git_fileno(FILE *stream);
# ifndef COMPAT_CODE
# ifndef COMPAT_CODE_FILENO
# undef fileno
# define fileno(p) git_fileno(p)
# endif
#endif

#ifdef NEED_ACCESS_ROOT_HANDLER
int git_access(const char *path, int mode);
# ifndef COMPAT_CODE_ACCESS
# ifdef access
# undef access
# endif
# define access(path, mode) git_access(path, mode)
# endif
#endif

/*
* Our code often opens a path to an optional file, to work on its
* contents when we can successfully open it. We can ignore a failure
Expand Down

0 comments on commit 40bef49

Please sign in to comment.