Skip to content

Commit

Permalink
Add compat/fopen.c which returns NULL on attempt to open directory
Browse files Browse the repository at this point in the history
Some systems do not fail as expected when fread et al. are called on
a directory stream. Replace fopen on such systems which will fail
when the supplied path is a directory.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Brandon Casey authored and Junio C Hamano committed Feb 12, 2008
1 parent 40aab81 commit cba2252
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ all::

# Define V=1 to have a more verbose compile.
#
# Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
# when attempting to read from an fopen'ed directory.
#
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
# This also implies MOZILLA_SHA1.
#
Expand Down Expand Up @@ -618,6 +621,10 @@ endif
ifdef NO_C99_FORMAT
BASIC_CFLAGS += -DNO_C99_FORMAT
endif
ifdef FREAD_READS_DIRECTORIES
COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
COMPAT_OBJS += compat/fopen.o
endif
ifdef NO_SYMLINK_HEAD
BASIC_CFLAGS += -DNO_SYMLINK_HEAD
endif
Expand Down
26 changes: 26 additions & 0 deletions compat/fopen.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#include "../git-compat-util.h"
#undef fopen
FILE *git_fopen(const char *path, const char *mode)
{
FILE *fp;
struct stat st;

if (mode[0] == 'w' || mode[0] == 'a')
return fopen(path, mode);

if (!(fp = fopen(path, mode)))
return NULL;

if (fstat(fileno(fp), &st)) {
fclose(fp);
return NULL;
}

if (S_ISDIR(st.st_mode)) {
fclose(fp);
errno = EISDIR;
return NULL;
}

return fp;
}
5 changes: 5 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,11 @@ void *gitmemmem(const void *haystack, size_t haystacklen,
const void *needle, size_t needlelen);
#endif

#ifdef FREAD_READS_DIRECTORIES
#define fopen(a,b) git_fopen(a,b)
extern FILE *git_fopen(const char*, const char*);
#endif

#ifdef __GLIBC_PREREQ
#if __GLIBC_PREREQ(2, 1)
#define HAVE_STRCHRNUL
Expand Down

0 comments on commit cba2252

Please sign in to comment.