Skip to content

Commit

Permalink
Merge pull request #905 from smcv/load-icarus
Browse files Browse the repository at this point in the history
Fix loading Icarus scripts from savegames, improve error reporting
  • Loading branch information
ensiform committed Jan 21, 2017
2 parents faeacb5 + 9c38824 commit 7b5f79a
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 34 deletions.
14 changes: 6 additions & 8 deletions code/game/G_Timer.cpp
Expand Up @@ -248,16 +248,14 @@ void TIMER_Load( void )

if (sg_buffer_size < 0 || static_cast<size_t>(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<int32_t>(
Expand Down
6 changes: 3 additions & 3 deletions code/game/Q3_Interface.cpp
Expand Up @@ -7328,7 +7328,7 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap )

if (idSize < 0 || static_cast<size_t>(idSize) >= sizeof(tempBuffer))
{
idSize = 0;
::G_Error("invalid length for FIDS string in save game: %d bytes\n", idSize);
}

saved_game.read_chunk(
Expand Down Expand Up @@ -7378,7 +7378,7 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap )

if (idSize < 0 || static_cast<size_t>(idSize) >= sizeof(tempBuffer))
{
idSize = 0;
::G_Error("invalid length for SIDS string in save game: %d bytes\n", idSize);
}

saved_game.read_chunk(
Expand All @@ -7394,7 +7394,7 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap )

if (idSize < 0 || static_cast<size_t>(idSize) >= sizeof(tempBuffer2))
{
idSize = 0;
::G_Error("invalid length for SVAL string in save game: %d bytes\n", idSize);
}

saved_game.read_chunk(
Expand Down
4 changes: 3 additions & 1 deletion code/game/g_roff.cpp
Expand Up @@ -704,7 +704,9 @@ void G_LoadCachedRoffs()
len);

if (len < 0 || static_cast<size_t>(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'),
Expand Down
35 changes: 17 additions & 18 deletions code/icarus/IcarusImplementation.cpp
Expand Up @@ -719,18 +719,18 @@ int CIcarus::Load()

int sg_buffer_size = saved_game.get_buffer_size();

if (sg_buffer_size < 0 || static_cast<size_t>(sg_buffer_size) >= sizeof(m_byBuffer))
if (sg_buffer_size < 0 || static_cast<size_t>(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 )
{
Expand Down Expand Up @@ -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<size_t>(sg_buffer_size) >= sizeof(m_byBuffer))
if (sg_buffer_size < 0 || static_cast<size_t>(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
}

Expand Down
6 changes: 3 additions & 3 deletions codeJK2/game/Q3_Registers.cpp
Expand Up @@ -410,7 +410,7 @@ void Q3_VariableLoadFloats( varFloat_m &fmap )

if (idSize < 0 || static_cast<size_t>(idSize) >= sizeof(tempBuffer))
{
idSize = 0;
::G_Error("invalid length for FIDS string in save game: %d bytes\n", idSize);
}

saved_game.read_chunk(
Expand Down Expand Up @@ -460,7 +460,7 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap )

if (idSize < 0 || static_cast<size_t>(idSize) >= sizeof(tempBuffer))
{
idSize = 0;
::G_Error("invalid length for SIDS string in save game: %d bytes\n", idSize);
}

saved_game.read_chunk(
Expand All @@ -476,7 +476,7 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap )

if (idSize < 0 || static_cast<size_t>(idSize) >= sizeof(tempBuffer2))
{
idSize = 0;
::G_Error("invalid length for SVAL string in save game: %d bytes\n", idSize);
}

saved_game.read_chunk(
Expand Down
2 changes: 1 addition & 1 deletion codeJK2/game/g_roff.cpp
Expand Up @@ -680,7 +680,7 @@ void G_LoadCachedRoffs()

if (len < 0 || static_cast<size_t>(len) >= sizeof(buffer))
{
len = 0;
::G_Error("invalid length for RSTR string in save game: %d bytes\n", len);
}

saved_game.read_chunk(
Expand Down

0 comments on commit 7b5f79a

Please sign in to comment.