Fix for Hiroshi Ito discovery of mis-aligned memory allocation
git-svn-id: svn://svn.berlios.de/openocd/trunk@1205 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
051dcd9127
commit
9689fa4802
|
@ -463,6 +463,39 @@ void* cmd_queue_alloc(size_t size)
|
||||||
int offset;
|
int offset;
|
||||||
u8 *t;
|
u8 *t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING:
|
||||||
|
* We align/round the *SIZE* per below
|
||||||
|
* so that all pointers returned by
|
||||||
|
* this function are reasonably well
|
||||||
|
* aligned.
|
||||||
|
*
|
||||||
|
* If we did not, then an "odd-length" request would cause the
|
||||||
|
* *next* allocation to be at an *odd* address, and because
|
||||||
|
* this function has the same type of api as malloc() - we
|
||||||
|
* must also return pointers that have the same type of
|
||||||
|
* alignment.
|
||||||
|
*
|
||||||
|
* What I do not/have is a reasonable portable means
|
||||||
|
* to align by...
|
||||||
|
*
|
||||||
|
* The solution here, is based on these suggestions.
|
||||||
|
* http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
union worse_case_align {
|
||||||
|
int i;
|
||||||
|
long l;
|
||||||
|
float f;
|
||||||
|
void *v;
|
||||||
|
};
|
||||||
|
#define ALIGN_SIZE (sizeof(union worse_case_align))
|
||||||
|
|
||||||
|
// The alignment process.
|
||||||
|
size = (size + ALIGN_SIZE -1) & (~(ALIGN_SIZE-1));
|
||||||
|
// Done...
|
||||||
|
|
||||||
|
|
||||||
if (*p_page)
|
if (*p_page)
|
||||||
{
|
{
|
||||||
while ((*p_page)->next)
|
while ((*p_page)->next)
|
||||||
|
|
Loading…
Reference in New Issue