Merge pull request #687 from stweil/memalign

Fix fatal crash on 64 bit Linux
This commit is contained in:
Matthieu Darbois
2016-01-06 23:15:05 +01:00

View File

@@ -1,6 +1,6 @@
/* /*
* The copyright in this software is being made available under the 2-clauses * 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 * BSD License, included below. This software may be subject to other third
* party and contributor rights, including patent rights, and no such rights * party and contributor rights, including patent rights, and no such rights
* are granted under this license. * are granted under this license.
* *
@@ -32,6 +32,10 @@
#define OPJ_SKIP_POISON #define OPJ_SKIP_POISON
#include "opj_includes.h" #include "opj_includes.h"
#if defined(OPJ_HAVE_MALLOC_H) && defined(OPJ_HAVE_MEMALIGN)
# include <malloc.h>
#endif
#ifndef SIZE_MAX #ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1) # define SIZE_MAX ((size_t) -1)
#endif #endif
@@ -68,7 +72,7 @@ static INLINE void *opj_aligned_alloc_n(size_t alignment, size_t size)
/* /*
* Generic aligned malloc implementation. * Generic aligned malloc implementation.
* Uses size_t offset for the integer manipulation of the pointer, * 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. * bitwise operations on the pointer itself.
*/ */
alignment--; 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 */ /* Room for padding and extra pointer stored in front of allocated area */
size_t overhead = alignment + sizeof(void *); size_t overhead = alignment + sizeof(void *);
/* let's be extra careful */ /* let's be extra careful */
assert(alignment <= (SIZE_MAX - sizeof(void *))); assert(alignment <= (SIZE_MAX - sizeof(void *)));
@@ -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) { if (new_size > SIZE_MAX - overhead) {
return NULL; return NULL;
} }
oldmem = ((void**) ptr)[-1]; oldmem = ((void**) ptr)[-1];
newmem = (OPJ_UINT8*)realloc(oldmem, new_size + overhead); newmem = (OPJ_UINT8*)realloc(oldmem, new_size + overhead);
if (newmem == NULL) { if (newmem == NULL) {