| 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);
|
| +}
|
|
|