mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
engine: despite byte-swapping code is no-op on little endian, it still fires and can read out of bounds on some models, leading to crash
This commit is contained in:
@@ -997,7 +997,6 @@ static int Mod_StudioBodyVariations( model_t *mod )
|
||||
static qboolean Mod_SwapStudioModel( const char *name, void *buffer, size_t buffersize )
|
||||
{
|
||||
studiohdr_t *phdr = buffer;
|
||||
byte *mod_base = buffer;
|
||||
|
||||
if( buffersize < sizeof( studiohdr_t ))
|
||||
return false;
|
||||
@@ -1008,12 +1007,13 @@ static qboolean Mod_SwapStudioModel( const char *name, void *buffer, size_t buff
|
||||
return false;
|
||||
|
||||
#if XASH_BIG_ENDIAN
|
||||
byte *mod_base = buffer;
|
||||
|
||||
if( phdr->studiohdr2index > 0 && phdr->studiohdr2index < phdr->length )
|
||||
{
|
||||
Con_Printf( S_ERROR "byteswapping extended studio model \"%s\" is unsupoprted\n", name );
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
for( int i = 0; i < phdr->numbones; i++ )
|
||||
le_struct_swap( mstudiobone_swap, (mstudiobone_t *)( mod_base + phdr->boneindex ) + i );
|
||||
@@ -1088,6 +1088,7 @@ static qboolean Mod_SwapStudioModel( const char *name, void *buffer, size_t buff
|
||||
short *pskinref = (short *)( mod_base + phdr->skinindex );
|
||||
for( int i = 0; i < phdr->numskinfamilies * phdr->numskinref; i++ )
|
||||
pskinref[i] = LittleShort( pskinref[i] );
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user