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:
Alibek Omarov
2026-05-16 12:21:46 +05:00
parent 516554b704
commit 4e4a54ab68

View File

@@ -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;
}