idClass::operator new() and delete: align to intptr_t

to avoid unaligned reads from class members of idClass or its
derived classes
This commit is contained in:
Daniel Gibson 2024-10-29 05:56:56 +01:00
parent af13c20614
commit fb3f0cc2b4
2 changed files with 24 additions and 24 deletions

View file

@ -444,10 +444,10 @@ idClass::new
#endif
void * idClass::operator new( size_t s ) {
int *p;
intptr_t *p;
s += sizeof( int );
p = (int *)Mem_Alloc( s );
s += sizeof( intptr_t );
p = (intptr_t *)Mem_Alloc( s );
*p = s;
memused += s;
numobjects++;
@ -455,7 +455,7 @@ void * idClass::operator new( size_t s ) {
#ifdef ID_DEBUG_UNINITIALIZED_MEMORY
unsigned int *ptr = (unsigned int *)p;
int size = s;
assert( ( size & 3 ) == 0 );
assert( ( size & (sizeof(intptr_t) - 1) ) == 0 );
size >>= 3;
for ( int i = 1; i < size; i++ ) {
ptr[i] = 0xcdcdcdcd;
@ -466,10 +466,10 @@ void * idClass::operator new( size_t s ) {
}
void * idClass::operator new( size_t s, int, int, char *, int ) {
int *p;
intptr_t *p;
s += sizeof( int );
p = (int *)Mem_Alloc( s );
s += sizeof( intptr_t );
p = (intptr_t *)Mem_Alloc( s );
*p = s;
memused += s;
numobjects++;
@ -477,7 +477,7 @@ void * idClass::operator new( size_t s, int, int, char *, int ) {
#ifdef ID_DEBUG_UNINITIALIZED_MEMORY
unsigned int *ptr = (unsigned int *)p;
int size = s;
assert( ( size & 3 ) == 0 );
assert( ( size & (sizeof(intptr_t) - 1) ) == 0 );
size >>= 3;
for ( int i = 1; i < size; i++ ) {
ptr[i] = 0xcdcdcdcd;
@ -497,10 +497,10 @@ idClass::delete
================
*/
void idClass::operator delete( void *ptr ) {
int *p;
intptr_t *p;
if ( ptr ) {
p = ( ( int * )ptr ) - 1;
p = ( ( intptr_t * )ptr ) - 1;
memused -= *p;
numobjects--;
Mem_Free( p );
@ -508,10 +508,10 @@ void idClass::operator delete( void *ptr ) {
}
void idClass::operator delete( void *ptr, int, int, char *, int ) {
int *p;
intptr_t *p;
if ( ptr ) {
p = ( ( int * )ptr ) - 1;
p = ( ( intptr_t * )ptr ) - 1;
memused -= *p;
numobjects--;
Mem_Free( p );

View file

@ -444,10 +444,10 @@ idClass::new
#endif
void * idClass::operator new( size_t s ) {
int *p;
intptr_t *p;
s += sizeof( int );
p = (int *)Mem_Alloc( s );
s += sizeof( intptr_t );
p = (intptr_t *)Mem_Alloc( s );
*p = s;
memused += s;
numobjects++;
@ -455,7 +455,7 @@ void * idClass::operator new( size_t s ) {
#ifdef ID_DEBUG_UNINITIALIZED_MEMORY
unsigned int *ptr = (unsigned int *)p;
int size = s;
assert( ( size & 3 ) == 0 );
assert( ( size & (sizeof(intptr_t) - 1) ) == 0 );
size >>= 3;
for ( int i = 1; i < size; i++ ) {
ptr[i] = 0xcdcdcdcd;
@ -466,10 +466,10 @@ void * idClass::operator new( size_t s ) {
}
void * idClass::operator new( size_t s, int, int, char *, int ) {
int *p;
intptr_t *p;
s += sizeof( int );
p = (int *)Mem_Alloc( s );
s += sizeof( intptr_t );
p = (intptr_t *)Mem_Alloc( s );
*p = s;
memused += s;
numobjects++;
@ -477,7 +477,7 @@ void * idClass::operator new( size_t s, int, int, char *, int ) {
#ifdef ID_DEBUG_UNINITIALIZED_MEMORY
unsigned int *ptr = (unsigned int *)p;
int size = s;
assert( ( size & 3 ) == 0 );
assert( ( size & (sizeof(intptr_t) - 1) ) == 0 );
size >>= 3;
for ( int i = 1; i < size; i++ ) {
ptr[i] = 0xcdcdcdcd;
@ -497,10 +497,10 @@ idClass::delete
================
*/
void idClass::operator delete( void *ptr ) {
int *p;
intptr_t *p;
if ( ptr ) {
p = ( ( int * )ptr ) - 1;
p = ( ( intptr_t * )ptr ) - 1;
memused -= *p;
numobjects--;
Mem_Free( p );
@ -508,10 +508,10 @@ void idClass::operator delete( void *ptr ) {
}
void idClass::operator delete( void *ptr, int, int, char *, int ) {
int *p;
intptr_t *p;
if ( ptr ) {
p = ( ( int * )ptr ) - 1;
p = ( ( intptr_t * )ptr ) - 1;
memused -= *p;
numobjects--;
Mem_Free( p );