Merge pull request #687 from stweil/memalign
Fix fatal crash on 64 bit Linux
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user