diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index fc8ed1e848..028613a4bd 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -248,16 +248,14 @@ void TIMER_Load( void ) if (sg_buffer_size < 0 || static_cast(sg_buffer_size) >= sizeof(tempBuffer)) { - sg_buffer_size = 0; - } - else - { - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - tempBuffer); + ::G_Error("invalid length for TMID string in saved game: %d\n", sg_buffer_size); } + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + tempBuffer); + tempBuffer[sg_buffer_size] = '\0'; saved_game.read_chunk( diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 2c740d48bb..585167a295 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -7328,7 +7328,7 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) { - idSize = 0; + ::G_Error("invalid length for FIDS string in save game: %d bytes\n", idSize); } saved_game.read_chunk( @@ -7378,7 +7378,7 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) { - idSize = 0; + ::G_Error("invalid length for SIDS string in save game: %d bytes\n", idSize); } saved_game.read_chunk( @@ -7394,7 +7394,7 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer2)) { - idSize = 0; + ::G_Error("invalid length for SVAL string in save game: %d bytes\n", idSize); } saved_game.read_chunk( diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 9ec25adfc2..a337b28423 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -704,7 +704,9 @@ void G_LoadCachedRoffs() len); if (len < 0 || static_cast(len) >= sizeof(buffer)) - len = 0; + { + ::G_Error("invalid length for RSTR string in save game: %d bytes\n", len); + } saved_game.read_chunk( INT_ID('R', 'S', 'T', 'R'), diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index cd6d01c663..f59da295ce 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -719,18 +719,18 @@ int CIcarus::Load() int sg_buffer_size = saved_game.get_buffer_size(); - if (sg_buffer_size < 0 || static_cast(sg_buffer_size) >= sizeof(m_byBuffer)) + if (sg_buffer_size < 0 || static_cast(sg_buffer_size) > MAX_BUFFER_SIZE) { - sg_buffer_size = 0; - } - else - { - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - m_byBuffer); + DestroyBuffer(); + game->DebugPrint( IGameInterface::WL_ERROR, "invalid ISEQ length: %d bytes\n", sg_buffer_size); + return false; } + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + m_byBuffer); + //Load all signals if ( LoadSignals() == false ) { @@ -859,18 +859,17 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) int sg_buffer_size = saved_game.get_buffer_size(); - if (sg_buffer_size < 0 || static_cast(sg_buffer_size) >= sizeof(m_byBuffer)) + if (sg_buffer_size < 0 || static_cast(sg_buffer_size) > MAX_BUFFER_SIZE) { - sg_buffer_size = 0; - } - else - { - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - m_byBuffer); + IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "invalid ISEQ length: %d bytes\n", sg_buffer_size); + return; } + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + m_byBuffer); + m_ulBytesRead = 0; //reset buffer } diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 25c99cd133..f278c09085 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -410,7 +410,7 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) { - idSize = 0; + ::G_Error("invalid length for FIDS string in save game: %d bytes\n", idSize); } saved_game.read_chunk( @@ -460,7 +460,7 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) { - idSize = 0; + ::G_Error("invalid length for SIDS string in save game: %d bytes\n", idSize); } saved_game.read_chunk( @@ -476,7 +476,7 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer2)) { - idSize = 0; + ::G_Error("invalid length for SVAL string in save game: %d bytes\n", idSize); } saved_game.read_chunk( diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index b5c0240f8f..b1c9539e26 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -680,7 +680,7 @@ void G_LoadCachedRoffs() if (len < 0 || static_cast(len) >= sizeof(buffer)) { - len = 0; + ::G_Error("invalid length for RSTR string in save game: %d bytes\n", len); } saved_game.read_chunk(