Просмотр исходного кода

Another attempt at type size correctness.

Ryan C. Gordon 23 лет назад
Родитель
Сommit
6f1d693fe8
3 измененных файлов с 12 добавлено и 9 удалено
  1. 3 2
      archivers/zip.c
  2. 7 5
      physfs.c
  3. 2 2
      physfs_internal.h

+ 3 - 2
archivers/zip.c

@@ -423,6 +423,7 @@ static PHYSFS_sint64 zip_find_end_of_central_dir(void *in, PHYSFS_sint64 *len)
 
     filelen = __PHYSFS_platformFileLength(in);
     BAIL_IF_MACRO(filelen == -1, NULL, 0);
+    BAIL_IF_MACRO(filelen > 0xFFFFFFFF, "ZIP bigger than 2 gigs?!", 0);
 
     /*
      * Jump to the end of the file and start reading backwards.
@@ -444,7 +445,7 @@ static PHYSFS_sint64 zip_find_end_of_central_dir(void *in, PHYSFS_sint64 *len)
     else
     {
         filepos = 0;
-        maxread = filelen;
+        maxread = (PHYSFS_uint32) filelen;
     } /* else */
 
     while ((totalread < filelen) && (totalread < 65557))
@@ -1062,7 +1063,7 @@ static int zip_parse_end_of_central_dir(void *in, DirHandle *dirh,
      *  sizeof central dir)...the difference in bytes is how much arbitrary
      *  data is at the start of the physical file.
      */
-    *data_start = pos - (*central_dir_ofs + ui32);
+    *data_start = (PHYSFS_uint32) (pos - (*central_dir_ofs + ui32));
 
     /* Now that we know the difference, fix up the central dir offset... */
     *central_dir_ofs += *data_start;

+ 7 - 5
physfs.c

@@ -1710,9 +1710,9 @@ static PHYSFS_sint64 doBufferedRead(PHYSFS_file *handle, void *buffer,
 
     while (objCount > 0)
     {
-        PHYSFS_uint64 buffered = h->buffill - h->bufpos;
+        PHYSFS_uint32 buffered = h->buffill - h->bufpos;
         PHYSFS_uint64 mustread = (objSize * objCount) - remainder;
-        PHYSFS_uint64 copied;
+        PHYSFS_uint32 copied;
 
         if (buffered == 0) /* need to refill buffer? */
         {
@@ -1723,12 +1723,12 @@ static PHYSFS_sint64 doBufferedRead(PHYSFS_file *handle, void *buffer,
                 return(((rc == -1) && (retval == 0)) ? -1 : retval);
             } /* if */
 
-            buffered = h->buffill = rc;
+            buffered = h->buffill = (PHYSFS_uint32) rc;
             h->bufpos = 0;
         } /* if */
 
         if (buffered > mustread)
-            buffered = mustread;
+            buffered = (PHYSFS_uint32) mustread;
 
         memcpy(buffer, h->buffer + h->bufpos, (size_t) buffered);
         buffer = ((PHYSFS_uint8 *) buffer) + buffered;
@@ -1828,10 +1828,12 @@ PHYSFS_sint64 PHYSFS_fileLength(PHYSFS_file *handle)
 } /* PHYSFS_filelength */
 
 
-int PHYSFS_setBuffer(PHYSFS_file *handle, PHYSFS_uint64 bufsize)
+int PHYSFS_setBuffer(PHYSFS_file *handle, PHYSFS_uint64 _bufsize)
 {
     FileHandle *h = (FileHandle *) handle->opaque;
+	PHYSFS_uint32 bufsize = (PHYSFS_uint32) _bufsize;
 
+    BAIL_IF_MACRO(_bufsize > 0xFFFFFFFF, "buffer must fit in 32-bits", 0);
     BAIL_IF_MACRO(!PHYSFS_flush(handle), NULL, 0);
 
     /*

+ 2 - 2
physfs_internal.h

@@ -837,12 +837,12 @@ typedef struct __PHYSFS_FILEHANDLE__
         /*
          * This is the buffer fill size. Don't touch.
          */
-    PHYSFS_uint64 buffill;
+    PHYSFS_uint32 buffill;
 
         /*
          * This is the buffer position. Don't touch.
          */
-    PHYSFS_uint64 bufpos;
+    PHYSFS_uint32 bufpos;
 
         /*
          * This should be the DirHandle that created this FileHandle.