This is an automated email from the git hooks/post-receive script. smcv pushed a commit to branch debian/master in repository openjk.
commit 836b708f59f9a9dbe6b29b0c76029b0f464625fc Author: Simon McVittie <[email protected]> Date: Sat Jan 21 15:32:04 2017 +0000 Add patches to fix bounds-checking in savegames, so valid saves are not rejected --- debian/changelog | 2 + ...-bounds-check-when-loading-from-savegames.patch | 41 +++++++ ...m-SOURCE_DATE_EPOCH-for-reproducible-buil.patch | 18 +-- ...arm-debug-code-that-writes-to-c-nofreeent.patch | 2 +- ...are-too-long-raise-error-instead-of-assum.patch | 131 +++++++++++++++++++++ ...oad-if-buffer-would-be-overflowed-don-t-j.patch | 67 +++++++++++ debian/patches/series | 3 + 7 files changed, 254 insertions(+), 10 deletions(-) diff --git a/debian/changelog b/debian/changelog index 89d74aa..333b408 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,8 @@ openjk (0~20170112+dfsg1-1) UNRELEASED; urgency=medium * New upstream snapshot - Drop patches that were applied upstream + * Add patches to fix bounds-checking in savegames, so valid saves + are not rejected -- Simon McVittie <[email protected]> Sat, 21 Jan 2017 15:25:05 +0000 diff --git a/debian/patches/Icarus-fix-bounds-check-when-loading-from-savegames.patch b/debian/patches/Icarus-fix-bounds-check-when-loading-from-savegames.patch new file mode 100644 index 0000000..0b3a127 --- /dev/null +++ b/debian/patches/Icarus-fix-bounds-check-when-loading-from-savegames.patch @@ -0,0 +1,41 @@ +From: Simon McVittie <[email protected]> +Date: Sat, 21 Jan 2017 15:06:40 +0000 +Subject: icarus: fix bounds check when loading from savegames + +m_byBuffer is a pointer to a fixed amount of dynamically allocated +memory, not a statically allocated buffer, so sizeof() is the wrong +tool here. Use the actual size of the buffer instead. + +Also, reading the full size of the buffer is fine, because we aren't +going to append '\0' afterwards like we do in the other places +touched by #881, so use > instead of >=. + +Bug: https://github.com/JACoders/OpenJK/pull/902 +Signed-off-by: Simon McVittie <[email protected]> +Forwarded: https://github.com/JACoders/OpenJK/pull/905 +--- + code/icarus/IcarusImplementation.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp +index 7d2fc8fc..cc893331 100644 +--- a/code/icarus/IcarusImplementation.cpp ++++ b/code/icarus/IcarusImplementation.cpp +@@ -718,7 +718,7 @@ 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; + } +@@ -858,7 +858,7 @@ 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; + } diff --git a/debian/patches/Pick-up-date-from-SOURCE_DATE_EPOCH-for-reproducible-buil.patch b/debian/patches/Pick-up-date-from-SOURCE_DATE_EPOCH-for-reproducible-buil.patch index d79aec0..cc660ec 100644 --- a/debian/patches/Pick-up-date-from-SOURCE_DATE_EPOCH-for-reproducible-buil.patch +++ b/debian/patches/Pick-up-date-from-SOURCE_DATE_EPOCH-for-reproducible-buil.patch @@ -30,7 +30,7 @@ Forwarded: https://github.com/JACoders/OpenJK/pull/874 8 files changed, 24 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt -index 7a17d4d..e393e4b 100644 +index 7a17d4d7..e393e4b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -302,6 +302,15 @@ if(BuildPortableVersion) @@ -50,7 +50,7 @@ index 7a17d4d..e393e4b 100644 diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp -index 8ae2c6d..6b385af 100644 +index 8ae2c6d4..6b385af3 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -617,7 +617,7 @@ void G_InitCvars( void ) { @@ -72,7 +72,7 @@ index 8ae2c6d..6b385af 100644 srand( randomSeed ); diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp -index a1e73e4..031e2b3 100644 +index a1e73e49..031e2b3b 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -1050,7 +1050,7 @@ Com_Init @@ -94,7 +94,7 @@ index a1e73e4..031e2b3 100644 #ifdef JK2_MODE diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp -index ef78173..3dba32d 100644 +index ef781737..3dba32dd 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -558,7 +558,7 @@ void G_InitCvars( void ) { @@ -116,7 +116,7 @@ index ef78173..3dba32d 100644 srand( randomSeed ); diff --git a/codemp/game/g_main.c b/codemp/game/g_main.c -index e2a3e6b..f70f6e1 100644 +index e2a3e6bf..f70f6e17 100644 --- a/codemp/game/g_main.c +++ b/codemp/game/g_main.c @@ -193,7 +193,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) { @@ -129,7 +129,7 @@ index e2a3e6b..f70f6e1 100644 srand( randomSeed ); diff --git a/codemp/game/g_xcvar.h b/codemp/game/g_xcvar.h -index ea1761c..ff0588b 100644 +index ea1761c7..ff0588bc 100644 --- a/codemp/game/g_xcvar.h +++ b/codemp/game/g_xcvar.h @@ -165,7 +165,7 @@ XCVAR_DEF( g_voteDelay, "3000", NULL, CVAR_NONE, qfalse ) @@ -142,7 +142,7 @@ index ea1761c..ff0588b 100644 XCVAR_DEF( pmove_fixed, "0", NULL, CVAR_SYSTEMINFO|CVAR_ARCHIVE, qtrue ) XCVAR_DEF( pmove_float, "0", NULL, CVAR_SYSTEMINFO|CVAR_ARCHIVE, qtrue ) diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp -index 525e3d4..3011c8d 100644 +index 525e3d44..3011c8de 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -1126,7 +1126,7 @@ void Com_Init( char *commandLine ) { @@ -164,10 +164,10 @@ index 525e3d4..3011c8d 100644 SE_Init(); diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h -index 0d60290..9e1067a 100644 +index ee5392e8..4f9ee545 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h -@@ -362,3 +362,8 @@ typedef union byteAlias_u { +@@ -358,3 +358,8 @@ typedef union byteAlias_u { #else #define PLATFORM_STRING OS_STRING "-" ARCH_STRING "-debug" #endif diff --git a/debian/patches/g_utils-disarm-debug-code-that-writes-to-c-nofreeent.patch b/debian/patches/g_utils-disarm-debug-code-that-writes-to-c-nofreeent.patch index 48069d9..0d4fd49 100644 --- a/debian/patches/g_utils-disarm-debug-code-that-writes-to-c-nofreeent.patch +++ b/debian/patches/g_utils-disarm-debug-code-that-writes-to-c-nofreeent.patch @@ -12,7 +12,7 @@ Forwarded: no 1 file changed, 2 insertions(+) diff --git a/code/game/g_utils.cpp b/code/game/g_utils.cpp -index 9273fad..4d04c15 100644 +index 9273fad5..4d04c157 100644 --- a/code/game/g_utils.cpp +++ b/code/game/g_utils.cpp @@ -818,6 +818,7 @@ gentity_t *G_Spawn( void ) diff --git a/debian/patches/game-If-strings-are-too-long-raise-error-instead-of-assum.patch b/debian/patches/game-If-strings-are-too-long-raise-error-instead-of-assum.patch new file mode 100644 index 0000000..e5d51a3 --- /dev/null +++ b/debian/patches/game-If-strings-are-too-long-raise-error-instead-of-assum.patch @@ -0,0 +1,131 @@ +From: Simon McVittie <[email protected]> +Date: Sat, 21 Jan 2017 15:12:50 +0000 +Subject: game: If strings are too long, + raise error instead of assuming 0 length + +Signed-off-by: Simon McVittie <[email protected]> +--- + code/game/G_Timer.cpp | 14 ++++++-------- + code/game/Q3_Interface.cpp | 6 +++--- + code/game/g_roff.cpp | 4 +++- + codeJK2/game/Q3_Registers.cpp | 6 +++--- + codeJK2/game/g_roff.cpp | 2 +- + 5 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp +index 192594d1..89ecb94f 100644 +--- a/code/game/G_Timer.cpp ++++ b/code/game/G_Timer.cpp +@@ -247,16 +247,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>( +diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp +index 2c740d48..585167a2 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<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( +@@ -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( +@@ -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( +diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp +index 9ec25adf..a337b284 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<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'), +diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp +index 25c99cd1..f278c090 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<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( +@@ -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( +@@ -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( +diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp +index b5c0240f..b1c9539e 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<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( diff --git a/debian/patches/icarus-Fail-to-load-if-buffer-would-be-overflowed-don-t-j.patch b/debian/patches/icarus-Fail-to-load-if-buffer-would-be-overflowed-don-t-j.patch new file mode 100644 index 0000000..cb0b479 --- /dev/null +++ b/debian/patches/icarus-Fail-to-load-if-buffer-would-be-overflowed-don-t-j.patch @@ -0,0 +1,67 @@ +From: Simon McVittie <[email protected]> +Date: Sat, 21 Jan 2017 15:10:39 +0000 +Subject: icarus: Fail to load if buffer would be overflowed, don't just skip + +Unfortunately CIcarus::BufferRead returns void, so we can't +return a failure state from here, but we can at least print an +error message. + +Signed-off-by: Simon McVittie <[email protected]> +Forwarded: https://github.com/JACoders/OpenJK/pull/905 +--- + code/icarus/IcarusImplementation.cpp | 31 +++++++++++++++---------------- + 1 file changed, 15 insertions(+), 16 deletions(-) + +diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp +index cc893331..c4e4f1fc 100644 +--- a/code/icarus/IcarusImplementation.cpp ++++ b/code/icarus/IcarusImplementation.cpp +@@ -720,16 +720,16 @@ int CIcarus::Load() + + 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 ) + { +@@ -860,16 +860,15 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) + + 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 + } + diff --git a/debian/patches/series b/debian/patches/series index 858ce4d..af92b1f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,5 @@ +Icarus-fix-bounds-check-when-loading-from-savegames.patch +icarus-Fail-to-load-if-buffer-would-be-overflowed-don-t-j.patch +game-If-strings-are-too-long-raise-error-instead-of-assum.patch Pick-up-date-from-SOURCE_DATE_EPOCH-for-reproducible-buil.patch g_utils-disarm-debug-code-that-writes-to-c-nofreeent.patch -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/openjk.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

