Procházet zdrojové kódy

Cleaned up overflow checks in platform memory allocators (thanks to Nicolas
Lebedenco for pointing out the original issue with long long literals).

Ryan C. Gordon před 20 roky
rodič
revize
a66c36b42a
8 změnil soubory, kde provedl 32 přidání a 36 odebrání
  1. 3 0
      CHANGELOG
  2. 17 0
      physfs_internal.h
  3. 2 6
      platform/macclassic.c
  4. 2 6
      platform/os2.c
  5. 2 6
      platform/pocketpc.c
  6. 2 6
      platform/posix.c
  7. 2 6
      platform/skeleton.c
  8. 2 6
      platform/win32.c

+ 3 - 0
CHANGELOG

@@ -2,6 +2,9 @@
  * CHANGELOG.
  * CHANGELOG.
  */
  */
 
 
+01012006 - Cleaned up overflow checks in platform memory allocators (thanks to
+           Nicolas Lebedenco for pointing out the original issue with
+           long long literals).
 11282005 - Corrected docs on PHYSFS_setWriteDir().
 11282005 - Corrected docs on PHYSFS_setWriteDir().
 10122005 - Fixed locateInStringList() in physfs.c (thanks, Matze!). Patched
 10122005 - Fixed locateInStringList() in physfs.c (thanks, Matze!). Patched
            archivers/wad.c to compile.
            archivers/wad.c to compile.

+ 17 - 0
physfs_internal.h

@@ -1253,6 +1253,23 @@ void __PHYSFS_sort(void *entries, PHYSFS_uint32 max,
 #define GOTO_MACRO_MUTEX(e, m, g) { __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); goto g; }
 #define GOTO_MACRO_MUTEX(e, m, g) { __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); goto g; }
 #define GOTO_IF_MACRO_MUTEX(c, e, m, g) if (c) { __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); goto g; }
 #define GOTO_IF_MACRO_MUTEX(c, e, m, g) if (c) { __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); goto g; }
 
 
+#ifdef __GNUC__
+#define LONGLONGLITERAL(x) x##LL
+#else
+#define LONGLONGLITERAL(x) x
+#endif
+
+/*
+ * Check if a ui64 will fit in the platform's address space.
+ *  The initial sizeof check will optimize this macro out entirely on
+ *  64-bit (and larger?!) platforms, and the other condition will
+ *  return zero or non-zero if the variable will fit in the platform's
+ *  size_t, suitable to pass to malloc. This is kinda messy, but effective.
+ */
+#define __PHYSFS_ui64FitsAddressSpace(s) ( \
+    (sizeof (PHYSFS_uint64) > sizeof (size_t)) && \
+    ((s) > (LONGLONGLITERAL(0xFFFFFFFFFFFFFFFF) >> (64-(sizeof(size_t)*8)))) \
+)
 
 
 /*
 /*
  * The current allocator. Not valid before PHYSFS_init is called!
  * The current allocator. Not valid before PHYSFS_init is called!

+ 2 - 6
platform/macclassic.c

@@ -944,9 +944,7 @@ void __PHYSFS_platformAllocatorDeinit(void)
 
 
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef malloc
     #undef malloc
     return(malloc((size_t) s));
     return(malloc((size_t) s));
 } /* __PHYSFS_platformMalloc */
 } /* __PHYSFS_platformMalloc */
@@ -954,9 +952,7 @@ void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 
 
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef realloc
     #undef realloc
     return(realloc(ptr, (size_t) s));
     return(realloc(ptr, (size_t) s));
 } /* __PHYSFS_platformRealloc */
 } /* __PHYSFS_platformRealloc */

+ 2 - 6
platform/os2.c

@@ -757,9 +757,7 @@ void __PHYSFS_platformAllocatorDeinit(void)
 
 
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef malloc
     #undef malloc
     return(malloc((size_t) s));
     return(malloc((size_t) s));
 } /* __PHYSFS_platformMalloc */
 } /* __PHYSFS_platformMalloc */
@@ -767,9 +765,7 @@ void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 
 
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef realloc
     #undef realloc
     return(realloc(ptr, (size_t) s));
     return(realloc(ptr, (size_t) s));
 } /* __PHYSFS_platformRealloc */
 } /* __PHYSFS_platformRealloc */

+ 2 - 6
platform/pocketpc.c

@@ -675,9 +675,7 @@ void __PHYSFS_platformAllocatorDeinit(void)
 
 
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef malloc
     #undef malloc
     return(malloc((size_t) s));
     return(malloc((size_t) s));
 } /* __PHYSFS_platformMalloc */
 } /* __PHYSFS_platformMalloc */
@@ -685,9 +683,7 @@ void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 
 
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef realloc
     #undef realloc
     return(realloc(ptr, (size_t) s));
     return(realloc(ptr, (size_t) s));
 } /* __PHYSFS_platformRealloc */
 } /* __PHYSFS_platformRealloc */

+ 2 - 6
platform/posix.c

@@ -517,9 +517,7 @@ void __PHYSFS_platformAllocatorDeinit(void)
 
 
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef malloc
     #undef malloc
     return(malloc((size_t) s));
     return(malloc((size_t) s));
 } /* __PHYSFS_platformMalloc */
 } /* __PHYSFS_platformMalloc */
@@ -527,9 +525,7 @@ void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 
 
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef realloc
     #undef realloc
     return(realloc(ptr, (size_t) s));
     return(realloc(ptr, (size_t) s));
 } /* __PHYSFS_platformRealloc */
 } /* __PHYSFS_platformRealloc */

+ 2 - 6
platform/skeleton.c

@@ -249,9 +249,7 @@ void __PHYSFS_platformAllocatorDeinit(void)
 
 
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef malloc
     #undef malloc
     return(malloc((size_t) s));
     return(malloc((size_t) s));
 } /* __PHYSFS_platformMalloc */
 } /* __PHYSFS_platformMalloc */
@@ -259,9 +257,7 @@ void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 
 
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef realloc
     #undef realloc
     return(realloc(ptr, (size_t) s));
     return(realloc(ptr, (size_t) s));
 } /* __PHYSFS_platformRealloc */
 } /* __PHYSFS_platformRealloc */

+ 2 - 6
platform/win32.c

@@ -1125,9 +1125,7 @@ void __PHYSFS_platformAllocatorDeinit(void)
 
 
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef malloc
     #undef malloc
     return(malloc((size_t) s));
     return(malloc((size_t) s));
 } /* __PHYSFS_platformMalloc */
 } /* __PHYSFS_platformMalloc */
@@ -1135,9 +1133,7 @@ void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
 
 
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
 {
 {
-    /* make sure s isn't larger than the address space of the platform... */
-    if ( s > (0xFFFFFFFFFFFFFFFF >> (64-(sizeof (size_t) * 8))) )
-        BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
+    BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
     #undef realloc
     #undef realloc
     return(realloc(ptr, (size_t) s));
     return(realloc(ptr, (size_t) s));
 } /* __PHYSFS_platformRealloc */
 } /* __PHYSFS_platformRealloc */