Index: src/libFLAC/memory.c |
diff --git a/src/libFLAC/memory.c b/src/libFLAC/memory.c |
index 4d100975087d2ab59f3708aad9671e14e472f7d0..d22df70eb8afb61a7f68c26047197ab7c3716045 100644 |
--- a/src/libFLAC/memory.c |
+++ b/src/libFLAC/memory.c |
@@ -1,5 +1,6 @@ |
/* libFLAC - Free Lossless Audio Codec library |
- * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson |
+ * Copyright (C) 2001-2009 Josh Coalson |
+ * Copyright (C) 2011-2014 Xiph.Org Foundation |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
@@ -29,10 +30,14 @@ |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
-#if HAVE_CONFIG_H |
+#ifdef HAVE_CONFIG_H |
# include <config.h> |
#endif |
+#ifdef HAVE_STDINT_H |
+#include <stdint.h> |
+#endif |
+ |
#include "private/memory.h" |
#include "FLAC/assert.h" |
#include "share/alloc.h" |
@@ -45,25 +50,8 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) |
#ifdef FLAC__ALIGN_MALLOC_DATA |
/* align on 32-byte (256-bit) boundary */ |
- x = safe_malloc_add_2op_(bytes, /*+*/31); |
-#ifdef SIZEOF_VOIDP |
-#if SIZEOF_VOIDP == 4 |
- /* could do *aligned_address = x + ((unsigned) (32 - (((unsigned)x) & 31))) & 31; */ |
- *aligned_address = (void*)(((unsigned)x + 31) & -32); |
-#elif SIZEOF_VOIDP == 8 |
- *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); |
-#else |
-# error Unsupported sizeof(void*) |
-#endif |
-#else |
- /* there's got to be a better way to do this right for all archs */ |
- if(sizeof(void*) == sizeof(unsigned)) |
- *aligned_address = (void*)(((unsigned)x + 31) & -32); |
- else if(sizeof(void*) == sizeof(FLAC__uint64)) |
- *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); |
- else |
- return 0; |
-#endif |
+ x = safe_malloc_add_2op_(bytes, /*+*/31L); |
+ *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); |
#else |
x = safe_malloc_(bytes); |
*aligned_address = x; |
@@ -71,7 +59,7 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) |
return x; |
} |
-FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) |
+FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) |
{ |
FLAC__int32 *pu; /* unaligned pointer */ |
union { /* union needed to comply with C99 pointer aliasing rules */ |
@@ -84,10 +72,10 @@ FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 |
FLAC__ASSERT(0 != aligned_pointer); |
FLAC__ASSERT(unaligned_pointer != aligned_pointer); |
- if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
+ if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
return false; |
- pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(*pu) * (size_t)elements, &u.pv); |
+ pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
if(0 == pu) { |
return false; |
} |
@@ -100,7 +88,7 @@ FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 |
} |
} |
-FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) |
+FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) |
{ |
FLAC__uint32 *pu; /* unaligned pointer */ |
union { /* union needed to comply with C99 pointer aliasing rules */ |
@@ -113,10 +101,10 @@ FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint |
FLAC__ASSERT(0 != aligned_pointer); |
FLAC__ASSERT(unaligned_pointer != aligned_pointer); |
- if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
+ if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
return false; |
- pu = (FLAC__uint32*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
+ pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
if(0 == pu) { |
return false; |
} |
@@ -129,7 +117,7 @@ FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint |
} |
} |
-FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) |
+FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) |
{ |
FLAC__uint64 *pu; /* unaligned pointer */ |
union { /* union needed to comply with C99 pointer aliasing rules */ |
@@ -142,10 +130,10 @@ FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint |
FLAC__ASSERT(0 != aligned_pointer); |
FLAC__ASSERT(unaligned_pointer != aligned_pointer); |
- if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
+ if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
return false; |
- pu = (FLAC__uint64*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
+ pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
if(0 == pu) { |
return false; |
} |
@@ -158,7 +146,7 @@ FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint |
} |
} |
-FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) |
+FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) |
{ |
unsigned *pu; /* unaligned pointer */ |
union { /* union needed to comply with C99 pointer aliasing rules */ |
@@ -171,10 +159,10 @@ FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned |
FLAC__ASSERT(0 != aligned_pointer); |
FLAC__ASSERT(unaligned_pointer != aligned_pointer); |
- if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
+ if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
return false; |
- pu = (unsigned*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
+ pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
if(0 == pu) { |
return false; |
} |
@@ -189,7 +177,7 @@ FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned |
#ifndef FLAC__INTEGER_ONLY_LIBRARY |
-FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) |
+FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) |
{ |
FLAC__real *pu; /* unaligned pointer */ |
union { /* union needed to comply with C99 pointer aliasing rules */ |
@@ -202,10 +190,10 @@ FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real * |
FLAC__ASSERT(0 != aligned_pointer); |
FLAC__ASSERT(unaligned_pointer != aligned_pointer); |
- if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
+ if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ |
return false; |
- pu = (FLAC__real*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
+ pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); |
if(0 == pu) { |
return false; |
} |
@@ -219,3 +207,12 @@ FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real * |
} |
#endif |
+ |
+void *safe_malloc_mul_2op_p(size_t size1, size_t size2) |
+{ |
+ if(!size1 || !size2) |
+ return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ |
+ if(size1 > SIZE_MAX / size2) |
+ return 0; |
+ return malloc(size1*size2); |
+} |