[Bf-blender-cvs] [64cd9a079b9] blender-v2.81-release: Fix T70952: EXR files bigger than 2GB don't open on Windows

Brecht Van Lommel noreply at git.blender.org
Wed Nov 6 18:25:43 CET 2019


Commit: 64cd9a079b987e1ef3daf926bd5af26185e297a5
Author: Brecht Van Lommel
Date:   Wed Nov 6 17:16:46 2019 +0100
Branches: blender-v2.81-release
https://developer.blender.org/rB64cd9a079b987e1ef3daf926bd5af26185e297a5

Fix T70952: EXR files bigger than 2GB don't open on Windows

===================================================================

M	intern/guardedalloc/intern/mmap_win.c
M	source/blender/blenlib/BLI_fileops.h
M	source/blender/blenlib/intern/storage.c

===================================================================

diff --git a/intern/guardedalloc/intern/mmap_win.c b/intern/guardedalloc/intern/mmap_win.c
index 5b0c4b6614a..3508ae4e1aa 100644
--- a/intern/guardedalloc/intern/mmap_win.c
+++ b/intern/guardedalloc/intern/mmap_win.c
@@ -125,8 +125,11 @@ void *mmap(void *UNUSED(start), size_t len, int prot, int flags, int fd, off_t o
     }
   }
 
-  /* note len is passed to a 32 bit DWORD, so can't be > 4 GB */
-  maphandle = CreateFileMapping(fhandle, NULL, prot_flags, 0, len, NULL);
+  /* Split 64 bit size into low and high bits. */
+  DWORD len_bits_high = len >> 32;
+  DWORD len_bits_low = len & 0xFFFFFFFF;
+
+  maphandle = CreateFileMapping(fhandle, NULL, prot_flags, len_bits_high, len_bits_low, NULL);
   if (maphandle == 0) {
     errno = EBADF;
     return MAP_FAILED;
diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index bdf7588291f..5c20e57181e 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -67,6 +67,7 @@ typedef struct _stat BLI_stat_t;
 typedef struct stat BLI_stat_t;
 #endif
 
+int BLI_fstat(int fd, BLI_stat_t *buffer) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 int BLI_stat(const char *path, BLI_stat_t *buffer) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 #ifdef WIN32
 int BLI_wstat(const wchar_t *path, BLI_stat_t *buffer);
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index fd5de717a24..7c481868d64 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -180,8 +180,8 @@ double BLI_dir_free_space(const char *dir)
  */
 size_t BLI_file_descriptor_size(int file)
 {
-  struct stat st;
-  if ((file < 0) || (fstat(file, &st) == -1)) {
+  BLI_stat_t st;
+  if ((file < 0) || (BLI_fstat(file, &st) == -1)) {
     return -1;
   }
   return st.st_size;
@@ -246,6 +246,15 @@ int BLI_exists(const char *name)
 }
 
 #ifdef WIN32
+int BLI_fstat(int fd, BLI_stat_t *buffer)
+{
+#  if defined(_MSC_VER)
+  return _fstat64(fd, buffer);
+#  else
+  return _fstat(fd, buffer);
+#  endif
+}
+
 int BLI_stat(const char *path, BLI_stat_t *buffer)
 {
   int r;
@@ -266,6 +275,11 @@ int BLI_wstat(const wchar_t *path, BLI_stat_t *buffer)
 #  endif
 }
 #else
+int BLI_fstat(int fd, struct stat *buffer)
+{
+  return fstat(fd, buffer);
+}
+
 int BLI_stat(const char *path, struct stat *buffer)
 {
   return stat(path, buffer);
@@ -298,8 +312,8 @@ static void *file_read_data_as_mem_impl(FILE *fp,
                                         size_t pad_bytes,
                                         size_t *r_size)
 {
-  struct stat st;
-  if (fstat(fileno(fp), &st) == -1) {
+  BLI_stat_t st;
+  if (BLI_fstat(fileno(fp), &st) == -1) {
     return NULL;
   }
   if (S_ISDIR(st.st_mode)) {



More information about the Bf-blender-cvs mailing list