Cast to size_t before multiplication
[openjpeg.git] / src / lib / openjp2 / opj_malloc.c
index a4aea30f252a759a52030210c3e311965f4a3598..4f8b1d6f77fc40717922e2fa8baad0e54aef5f20 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
 #define OPJ_SKIP_POISON
 #include "opj_includes.h"
 
+#if defined(OPJ_HAVE_MALLOC_H) && defined(OPJ_HAVE_MEMALIGN)
+# include <malloc.h>
+#endif
+
 #ifndef SIZE_MAX
 # define SIZE_MAX ((size_t) -1)
 #endif
@@ -49,7 +53,7 @@ static INLINE void *opj_aligned_alloc_n(size_t alignment, size_t size)
     return NULL;
   }
 
-#if defined(HAVE_POSIX_MEMALIGN)
+#if defined(OPJ_HAVE_POSIX_MEMALIGN)
   /* aligned_alloc requires c11, restrict to posix_memalign for now. Quote:
    * This function was introduced in POSIX 1003.1d. Although this function is
    * superseded by aligned_alloc, it is more portable to older POSIX systems
@@ -59,16 +63,16 @@ static INLINE void *opj_aligned_alloc_n(size_t alignment, size_t size)
     ptr = NULL;
   }
   /* older linux */
-#elif defined(HAVE_MEMALIGN)
+#elif defined(OPJ_HAVE_MEMALIGN)
   ptr = memalign( alignment, size );
 /* _MSC_VER */
-#elif defined(HAVE__ALIGNED_MALLOC)
+#elif defined(OPJ_HAVE__ALIGNED_MALLOC)
   ptr = _aligned_malloc(size, alignment);
 #else
   /*
    * Generic aligned malloc implementation.
    * Uses size_t offset for the integer manipulation of the pointer,
-   * as uintptr_t is not available in C89 to do 
+   * as uintptr_t is not available in C89 to do
    * bitwise operations on the pointer itself.
    */
   alignment--;
@@ -78,7 +82,7 @@ static INLINE void *opj_aligned_alloc_n(size_t alignment, size_t size)
 
     /* Room for padding and extra pointer stored in front of allocated area */
     size_t overhead = alignment + sizeof(void *);
-               
+
     /* let's be extra careful */
     assert(alignment <= (SIZE_MAX - sizeof(void *)));
 
@@ -114,8 +118,8 @@ static INLINE void *opj_aligned_realloc_n(void *ptr, size_t alignment, size_t ne
   }
 
 /* no portable aligned realloc */
-#if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN)
-  /* glibc doc states one can mixed aligned malloc with realloc */
+#if defined(OPJ_HAVE_POSIX_MEMALIGN) || defined(OPJ_HAVE_MEMALIGN)
+  /* glibc doc states one can mix aligned malloc with realloc */
   r_ptr = realloc( ptr, new_size ); /* fast path */
   /* we simply use `size_t` to cast, since we are only interest in binary AND
    * operator */
@@ -132,7 +136,7 @@ static INLINE void *opj_aligned_realloc_n(void *ptr, size_t alignment, size_t ne
     r_ptr = a_ptr;
   }
 /* _MSC_VER */
-#elif defined(HAVE__ALIGNED_MALLOC)
+#elif defined(OPJ_HAVE__ALIGNED_MALLOC)
   r_ptr = _aligned_realloc( ptr, new_size, alignment );
 #else
   if (ptr == NULL) {
@@ -151,7 +155,7 @@ static INLINE void *opj_aligned_realloc_n(void *ptr, size_t alignment, size_t ne
     if (new_size > SIZE_MAX - overhead) {
       return NULL;
     }
-               
+
     oldmem = ((void**) ptr)[-1];
     newmem = (OPJ_UINT8*)realloc(oldmem, new_size + overhead);
     if (newmem == NULL) {
@@ -192,10 +196,10 @@ void * opj_malloc(size_t size)
 }
 void * opj_calloc(size_t num, size_t size)
 {
-  if (size == 0U) { /* prevent implementation defined behavior of realloc */
+  if (num == 0 || size == 0) {
+    /* prevent implementation defined behavior of realloc */
     return NULL;
   }
-  /* according to C89 standard, num == 0 shall return a valid pointer */
   return calloc(num, size);
 }
 
@@ -210,9 +214,9 @@ void * opj_aligned_realloc(void *ptr, size_t size)
 
 void opj_aligned_free(void* ptr)
 {
-#if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN)
+#if defined(OPJ_HAVE_POSIX_MEMALIGN) || defined(OPJ_HAVE_MEMALIGN)
   free( ptr );
-#elif defined(HAVE__ALIGNED_MALLOC)
+#elif defined(OPJ_HAVE__ALIGNED_MALLOC)
   _aligned_free( ptr );
 #else
   /* Generic implementation has malloced pointer stored in front of used area */