engine: fix possible buffer overflow in S_StreamGetCurrentState

This commit is contained in:
Alibek Omarov 2024-05-06 06:53:22 +03:00
parent e754de46d1
commit 5120657386
5 changed files with 8 additions and 9 deletions

View file

@ -142,7 +142,7 @@ S_StreamGetCurrentState
save\restore code save\restore code
================= =================
*/ */
qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *position ) qboolean S_StreamGetCurrentState( char *currentTrack, size_t currentTrackSize, char *loopTrack, size_t loopTrackSize, int *position )
{ {
if( !s_bgTrack.stream ) if( !s_bgTrack.stream )
return false; // not active return false; // not active
@ -150,15 +150,15 @@ qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *posi
if( currentTrack ) if( currentTrack )
{ {
if( s_bgTrack.current[0] ) if( s_bgTrack.current[0] )
Q_strncpy( currentTrack, s_bgTrack.current, MAX_STRING ); Q_strncpy( currentTrack, s_bgTrack.current, currentTrackSize );
else Q_strncpy( currentTrack, "*", MAX_STRING ); // no track else Q_strncpy( currentTrack, "*", currentTrackSize ); // no track
} }
if( loopTrack ) if( loopTrack )
{ {
if( s_bgTrack.loopName[0] ) if( s_bgTrack.loopName[0] )
Q_strncpy( loopTrack, s_bgTrack.loopName, MAX_STRING ); Q_strncpy( loopTrack, s_bgTrack.loopName, loopTrackSize );
else Q_strncpy( loopTrack, "*", MAX_STRING ); // no track else Q_strncpy( loopTrack, "*", loopTrackSize ); // no track
} }
if( position ) if( position )

View file

@ -257,7 +257,6 @@ void SND_ForceCloseMouth( int entnum );
// //
void S_StreamSoundTrack( void ); void S_StreamSoundTrack( void );
void S_StreamBackgroundTrack( void ); void S_StreamBackgroundTrack( void );
qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *position );
void S_PrintBackgroundTrackState( void ); void S_PrintBackgroundTrackState( void );
void S_FadeMusicVolume( float fadePercent ); void S_FadeMusicVolume( float fadePercent );

View file

@ -695,7 +695,7 @@ void Log_Printf( const char *fmt, ... ) _format( 1 );
void SV_BroadcastCommand( const char *fmt, ... ) _format( 1 ); void SV_BroadcastCommand( const char *fmt, ... ) _format( 1 );
void SV_BroadcastPrintf( struct sv_client_s *ignore, const char *fmt, ... ) _format( 2 ); void SV_BroadcastPrintf( struct sv_client_s *ignore, const char *fmt, ... ) _format( 2 );
void CL_ClearStaticEntities( void ); void CL_ClearStaticEntities( void );
qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *position ); qboolean S_StreamGetCurrentState( char *currentTrack, size_t currentTrackSize, char *loopTrack, size_t loopTrackSize, int *position );
void CL_ServerCommand( qboolean reliable, const char *fmt, ... ) _format( 2 ); void CL_ServerCommand( qboolean reliable, const char *fmt, ... ) _format( 2 );
void CL_HudMessage( const char *pMessage ); void CL_HudMessage( const char *pMessage );
const char *CL_MsgInfo( int cmd ); const char *CL_MsgInfo( int cmd );

View file

@ -666,7 +666,7 @@ void SV_RestartAmbientSounds( void )
#if !XASH_DEDICATED // TODO: ??? #if !XASH_DEDICATED // TODO: ???
// restart soundtrack // restart soundtrack
if( S_StreamGetCurrentState( curtrack, looptrack, &position )) if( S_StreamGetCurrentState( curtrack, sizeof( curtrack ), looptrack, sizeof( looptrack ), &position ))
{ {
SV_StartMusic( curtrack, looptrack, position ); SV_StartMusic( curtrack, looptrack, position );
} }

View file

@ -1202,7 +1202,7 @@ static void SaveClientState( SAVERESTOREDATA *pSaveData, const char *level, int
header.soundCount = S_GetCurrentDynamicSounds( soundInfo, MAX_CHANNELS ); header.soundCount = S_GetCurrentDynamicSounds( soundInfo, MAX_CHANNELS );
#if !XASH_DEDICATED #if !XASH_DEDICATED
// music not reqiured to save position: it's just continue playing on a next level // music not reqiured to save position: it's just continue playing on a next level
S_StreamGetCurrentState( header.introTrack, header.mainTrack, &header.trackPosition ); S_StreamGetCurrentState( header.introTrack, sizeof( header.introTrack ), header.mainTrack, sizeof( header.mainTrack ), &header.trackPosition );
#endif #endif
} }