[Bf-blender-cvs] [5ea1049e752] master: Sanitize type 'size' parameters in our read/write file code

Bastien Montagne noreply at git.blender.org
Sun Sep 20 18:42:48 CEST 2020


Commit: 5ea1049e7520c0f369d2a76811410b1274699e81
Author: Bastien Montagne
Date:   Sun Sep 20 18:41:50 2020 +0200
Branches: master
https://developer.blender.org/rB5ea1049e7520c0f369d2a76811410b1274699e81

Sanitize type 'size' parameters in our read/write file code

This patch tries to sanitize the types of our size parameters across our read
and write code, which is currently fairly inconsistent (using `int`, `uint`,
`size_t`...), by using `size_t` everywhere. Since in Blender file themselves
we can only store chunk of size `MAX_INT`, added some asserts to ensure that
as well.

See {T79561} for details.

Differential Revision: https://developer.blender.org/D8672

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

M	source/blender/blenkernel/intern/idprop.c
M	source/blender/blenloader/BLO_read_write.h
M	source/blender/blenloader/BLO_undofile.h
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/readfile.h
M	source/blender/blenloader/intern/undofile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/modifiers/intern/MOD_correctivesmooth.c

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

diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index a3e7d8c794d..af15b9143e7 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -1186,7 +1186,7 @@ static void IDP_WriteArray(const IDProperty *prop, BlendWriter *writer)
 {
   /*REMEMBER to set totalen to len in the linking code!!*/
   if (prop->data.pointer) {
-    BLO_write_raw(writer, (int)MEM_allocN_len(prop->data.pointer), prop->data.pointer);
+    BLO_write_raw(writer, MEM_allocN_len(prop->data.pointer), prop->data.pointer);
 
     if (prop->subtype == IDP_GROUP) {
       IDProperty **array = prop->data.pointer;
@@ -1217,7 +1217,7 @@ static void IDP_WriteIDPArray(const IDProperty *prop, BlendWriter *writer)
 static void IDP_WriteString(const IDProperty *prop, BlendWriter *writer)
 {
   /*REMEMBER to set totalen to len in the linking code!!*/
-  BLO_write_raw(writer, prop->len, prop->data.pointer);
+  BLO_write_raw(writer, (size_t)prop->len, prop->data.pointer);
 }
 
 static void IDP_WriteGroup(const IDProperty *prop, BlendWriter *writer)
diff --git a/source/blender/blenloader/BLO_read_write.h b/source/blender/blenloader/BLO_read_write.h
index 8a6811444af..e3ba7480b18 100644
--- a/source/blender/blenloader/BLO_read_write.h
+++ b/source/blender/blenloader/BLO_read_write.h
@@ -143,13 +143,13 @@ void blo_write_id_struct(BlendWriter *writer,
   blo_write_id_struct(writer, BLO_get_struct_id(writer, struct_name), id_address, id)
 
 /* Write raw data. */
-void BLO_write_raw(BlendWriter *writer, int size_in_bytes, const void *data_ptr);
-void BLO_write_int32_array(BlendWriter *writer, int size, const int32_t *data_ptr);
-void BLO_write_uint32_array(BlendWriter *writer, int size, const uint32_t *data_ptr);
-void BLO_write_float_array(BlendWriter *writer, int size, const float *data_ptr);
-void BLO_write_float3_array(BlendWriter *writer, int size, const float *data_ptr);
-void BLO_write_pointer_array(BlendWriter *writer, int size, const void *data_ptr);
-void BLO_write_string(BlendWriter *writer, const char *str);
+void BLO_write_raw(BlendWriter *writer, size_t size_in_bytes, const void *data_ptr);
+void BLO_write_int32_array(BlendWriter *writer, uint num, const int32_t *data_ptr);
+void BLO_write_uint32_array(BlendWriter *writer, uint num, const uint32_t *data_ptr);
+void BLO_write_float_array(BlendWriter *writer, uint num, const float *data_ptr);
+void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr);
+void BLO_write_pointer_array(BlendWriter *writer, uint num, const void *data_ptr);
+void BLO_write_string(BlendWriter *writer, const char *data_ptr);
 
 /* Misc. */
 bool BLO_write_is_undo(BlendWriter *writer);
diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h
index f5527c13429..17b21096bf3 100644
--- a/source/blender/blenloader/BLO_undofile.h
+++ b/source/blender/blenloader/BLO_undofile.h
@@ -31,7 +31,7 @@ typedef struct {
   void *next, *prev;
   const char *buf;
   /** Size in bytes. */
-  unsigned int size;
+  size_t size;
   /** When true, this chunk doesn't own the memory, it's shared with a previous #MemFileChunk */
   bool is_identical;
   /** When true, this chunk is also identical to the one in the next step (used by undo code to
@@ -72,7 +72,7 @@ void BLO_memfile_write_init(MemFileWriteData *mem_data,
                             MemFile *reference_memfile);
 void BLO_memfile_write_finalize(MemFileWriteData *mem_data);
 
-void BLO_memfile_chunk_add(MemFileWriteData *mem_data, const char *buf, unsigned int size);
+void BLO_memfile_chunk_add(MemFileWriteData *mem_data, const char *buf, size_t size);
 
 /* exports */
 extern void BLO_memfile_free(MemFile *memfile);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index bc04720d5e4..6e0fc1752a9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -809,7 +809,7 @@ static void bh8_from_bh4(BHead *bhead, BHead4 *bhead4)
 static BHeadN *get_bhead(FileData *fd)
 {
   BHeadN *new_bhead = NULL;
-  int readsize;
+  ssize_t readsize;
 
   if (fd) {
     if (!fd->is_eof) {
@@ -908,7 +908,7 @@ static BHeadN *get_bhead(FileData *fd)
       }
 #endif
       else {
-        new_bhead = MEM_mallocN(sizeof(BHeadN) + bhead.len, "new_bhead");
+        new_bhead = MEM_mallocN(sizeof(BHeadN) + (size_t)bhead.len, "new_bhead");
         if (new_bhead) {
           new_bhead->next = new_bhead->prev = NULL;
 #ifdef USE_BHEAD_READ_ON_DEMAND
@@ -918,9 +918,10 @@ static BHeadN *get_bhead(FileData *fd)
           new_bhead->is_memchunk_identical = false;
           new_bhead->bhead = bhead;
 
-          readsize = fd->read(fd, new_bhead + 1, bhead.len, &new_bhead->is_memchunk_identical);
+          readsize = fd->read(
+              fd, new_bhead + 1, (size_t)bhead.len, &new_bhead->is_memchunk_identical);
 
-          if (readsize != bhead.len) {
+          if (readsize != (ssize_t)bhead.len) {
             fd->is_eof = true;
             MEM_freeN(new_bhead);
             new_bhead = NULL;
@@ -1008,8 +1009,8 @@ static bool blo_bhead_read_data(FileData *fd, BHead *thisblock, void *buf)
     success = false;
   }
   else {
-    if (fd->read(fd, buf, new_bhead->bhead.len, &new_bhead->is_memchunk_identical) !=
-        new_bhead->bhead.len) {
+    if (fd->read(fd, buf, (size_t)new_bhead->bhead.len, &new_bhead->is_memchunk_identical) !=
+        (ssize_t)new_bhead->bhead.len) {
       success = false;
     }
   }
@@ -1044,7 +1045,7 @@ const char *blo_bhead_id_name(const FileData *fd, const BHead *bhead)
 static void decode_blender_header(FileData *fd)
 {
   char header[SIZEOFBLENDERHEADER], num[4];
-  int readsize;
+  ssize_t readsize;
 
   /* read in the header data */
   readsize = fd->read(fd, header, sizeof(header), NULL);
@@ -1178,12 +1179,12 @@ static int *read_file_thumbnail(FileData *fd)
 
 /* Regular file reading. */
 
-static int fd_read_data_from_file(FileData *filedata,
-                                  void *buffer,
-                                  uint size,
-                                  bool *UNUSED(r_is_memchunck_identical))
+static ssize_t fd_read_data_from_file(FileData *filedata,
+                                      void *buffer,
+                                      size_t size,
+                                      bool *UNUSED(r_is_memchunck_identical))
 {
-  int readsize = read(filedata->filedes, buffer, size);
+  ssize_t readsize = read(filedata->filedes, buffer, size);
 
   if (readsize < 0) {
     readsize = EOF;
@@ -1203,12 +1204,14 @@ static off64_t fd_seek_data_from_file(FileData *filedata, off64_t offset, int wh
 
 /* GZip file reading. */
 
-static int fd_read_gzip_from_file(FileData *filedata,
-                                  void *buffer,
-                                  uint size,
-                                  bool *UNUSED(r_is_memchunck_identical))
+static ssize_t fd_read_gzip_from_file(FileData *filedata,
+                                      void *buffer,
+                                      size_t size,
+                                      bool *UNUSED(r_is_memchunck_identical))
 {
-  int readsize = gzread(filedata->gzfiledes, buffer, size);
+  BLI_assert(size <= INT_MAX);
+
+  ssize_t readsize = gzread(filedata->gzfiledes, buffer, (uint)size);
 
   if (readsize < 0) {
     readsize = EOF;
@@ -1222,15 +1225,15 @@ static int fd_read_gzip_from_file(FileData *filedata,
 
 /* Memory reading. */
 
-static int fd_read_from_memory(FileData *filedata,
-                               void *buffer,
-                               uint size,
-                               bool *UNUSED(r_is_memchunck_identical))
+static ssize_t fd_read_from_memory(FileData *filedata,
+                                   void *buffer,
+                                   size_t size,
+                                   bool *UNUSED(r_is_memchunck_identical))
 {
   /* don't read more bytes then there are available in the buffer */
-  int readsize = (int)MIN2(size, (uint)(filedata->buffersize - filedata->file_offset));
+  ssize_t readsize = (ssize_t)MIN2(size, filedata->buffersize - (size_t)filedata->file_offset);
 
-  memcpy(buffer, filedata->buffer + filedata->file_offset, readsize);
+  memcpy(buffer, filedata->buffer + filedata->file_offset, (size_t)readsize);
   filedata->file_offset += readsize;
 
   return readsize;
@@ -1238,10 +1241,10 @@ static int fd_read_from_memory(FileData *filedata,
 
 /* MemFile reading. */
 
-static int fd_read_from_memfile(FileData *filedata,
-                                void *buffer,
-                                uint size,
-                                bool *r_is_memchunck_identical)
+static ssize_t fd_read_from_memfile(FileData *filedata,
+                                    void *buffer,
+                                    size_t size,
+                                    bool *r_is_memchunck_identical)
 {
   static size_t seek = SIZE_MAX; /* the current position */
   static size_t offset = 0;      /* size of previous chunks */
@@ -1268,7 +1271,7 @@ static int fd_read_from_memfile(FileData *filedata,
       chunk = chunk->next;
     }
     offset = seek;
-    seek = filedata->file_offset;
+    seek = (size_t)filedata->file_offset;
   }
 
   if (chunk) {
@@ -1312,7 +1315,7 @@ static int fd_read_from_memfile(FileData *filedata,
       }
     } while (totread < size);
 
-    return totread;
+    return (ssize_t)totread;
   }
 
   return 0;
@@ -1474,15 +1477,15 @@ static FileData *blo_filedata_from_file_minimal(const char *filepath)
   return NULL;
 }
 
-static int fd_read_gzip_from_memory(FileData *filedata,
-                                    void *buffer,
-                                    uint size,
-                                    bool *UNUSED(r_is_memchunck_identical))
+static ssize_t fd_read_gzip_from_memory(FileData *filedata,
+                                        void *buffer,
+                                        size_t size,
+                                        bool *UNUSED(r_is_memchunck_identical))
 {
   int err;
 
   filedata->strm.next_out = (Bytef *)buffer;
-  filedata->strm.avai

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list