win32: Use an 64-bit file offset type Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
diff --git a/src/common.h b/src/common.h
index 35df534..29a61a7 100644
--- a/src/common.h
+++ b/src/common.h
@@ -25,6 +25,7 @@
#include <string.h>
#include <sys/types.h>
+#include <sys/stat.h>
#ifdef GIT_WIN32
@@ -51,6 +52,23 @@ typedef SSIZE_T ssize_t;
# define R_OK 4 /* read mode check */
# endif
+#if defined(__MINGW32__)
+
+# define off_t off64_t
+# define lseek _lseeki64
+# define stat _stati64
+# define fstat _fstati64
+
+#elif defined(_MSC_VER)
+
+typedef __int64 off64_t;
+# define off_t off64_t
+# define lseek _lseeki64
+# define stat _stat64
+# define fstat _fstat64
+
+#endif
+
#else
# include <unistd.h>
diff --git a/src/fileops.c b/src/fileops.c
index 5de89cb..b2dea1e 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -69,7 +69,8 @@ off_t gitfo_size(git_file fd)
int gitfo_read_file(gitfo_buf *obj, const char *path)
{
git_file fd;
- off_t len;
+ size_t len;
+ off_t size;
unsigned char *buff;
assert(obj && path && *path);
@@ -77,8 +78,13 @@ int gitfo_read_file(gitfo_buf *obj, const char *path)
if ((fd = gitfo_open(path, O_RDONLY)) < 0)
return GIT_ERROR;
- if (((len = gitfo_size(fd)) < 0)
- || ((buff = git__malloc(len + 1)) == NULL)) {
+ if (((size = gitfo_size(fd)) < 0) || !git__is_sizet(size+1)) {
+ gitfo_close(fd);
+ return GIT_ERROR;
+ }
+ len = (size_t) size;
+
+ if ((buff = git__malloc(len + 1)) == NULL) {
gitfo_close(fd);
return GIT_ERROR;
}
diff --git a/src/fileops.h b/src/fileops.h
index 98fffeb..b5cc24e 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -9,7 +9,6 @@
#include "common.h"
#include "map.h"
#include "dir.h"
-#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
diff --git a/src/win32/map.c b/src/win32/map.c
index 7d685c7..388e9c6 100644
--- a/src/win32/map.c
+++ b/src/win32/map.c
@@ -77,9 +77,9 @@ int git__mmap(git_map *out, size_t len, int prot, int flags, int fd, off_t offse
return GIT_ERROR;
}
+ assert(sizeof(off_t) == 8);
off_low = (DWORD)(page_start);
- if (sizeof(off_t) > 4)
- off_hi = (DWORD)(page_start >> 32);
+ off_hi = (DWORD)(page_start >> 32);
out->data = MapViewOfFile(out->fmh, view_prot, off_hi, off_low, len);
if (!out->data) {
/* errno = ? */