This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian/master
in repository openjk.

commit 9aea7956e06c06e8ac0f7ed813c0e481da1a7779
Author: Simon McVittie <[email protected]>
Date:   Fri Oct 28 11:37:21 2016 +0100

    savegames: bounds-check some string lengths to prevent buffer overflow
---
 code/game/G_Timer.cpp                | 17 ++++++++++++-----
 code/game/Q3_Interface.cpp           | 15 +++++++++++++++
 code/game/g_roff.cpp                 |  3 +++
 code/icarus/IcarusImplementation.cpp | 34 ++++++++++++++++++++++++----------
 codeJK2/game/Q3_Registers.cpp        | 15 +++++++++++++++
 codeJK2/game/g_roff.cpp              |  5 +++++
 6 files changed, 74 insertions(+), 15 deletions(-)

diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp
index d72f525..192594d 100644
--- a/code/game/G_Timer.cpp
+++ b/code/game/G_Timer.cpp
@@ -243,12 +243,19 @@ void TIMER_Load( void )
                        const char* sg_buffer_data = static_cast<const char*>(
                                saved_game.get_buffer_data());
 
-                       const int sg_buffer_size = saved_game.get_buffer_size();
+                       int sg_buffer_size = saved_game.get_buffer_size();
 
-                       std::uninitialized_copy_n(
-                               sg_buffer_data,
-                               sg_buffer_size,
-                               tempBuffer);
+                       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);
+                       }
 
                        tempBuffer[sg_buffer_size] = '\0';
 
diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp
index 56feeeb..2c740d4 100644
--- a/code/game/Q3_Interface.cpp
+++ b/code/game/Q3_Interface.cpp
@@ -7326,6 +7326,11 @@ void CQuake3GameInterface::VariableLoadFloats( 
varFloat_m &fmap )
                        INT_ID('F', 'I', 'D', 'L'),
                        idSize);
 
+               if (idSize < 0 || static_cast<size_t>(idSize) >= 
sizeof(tempBuffer))
+               {
+                       idSize = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('F', 'I', 'D', 'S'),
                        tempBuffer,
@@ -7371,6 +7376,11 @@ void CQuake3GameInterface::VariableLoadStrings( int 
type, varString_m &fmap )
                        INT_ID('S', 'I', 'D', 'L'),
                        idSize);
 
+               if (idSize < 0 || static_cast<size_t>(idSize) >= 
sizeof(tempBuffer))
+               {
+                       idSize = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('S', 'I', 'D', 'S'),
                        tempBuffer,
@@ -7382,6 +7392,11 @@ void CQuake3GameInterface::VariableLoadStrings( int 
type, varString_m &fmap )
                        INT_ID('S', 'V', 'S', 'Z'),
                        idSize);
 
+               if (idSize < 0 || static_cast<size_t>(idSize) >= 
sizeof(tempBuffer2))
+               {
+                       idSize = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('S', 'V', 'A', 'L'),
                        tempBuffer2,
diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp
index fe1f79f..9ec25ad 100644
--- a/code/game/g_roff.cpp
+++ b/code/game/g_roff.cpp
@@ -703,6 +703,9 @@ void G_LoadCachedRoffs()
                        INT_ID('S', 'L', 'E', 'N'),
                        len);
 
+               if (len < 0 || static_cast<size_t>(len) >= sizeof(buffer))
+                       len = 0;
+
                saved_game.read_chunk(
                        INT_ID('R', 'S', 'T', 'R'),
                        buffer,
diff --git a/code/icarus/IcarusImplementation.cpp 
b/code/icarus/IcarusImplementation.cpp
index 26004b3..7d2fc8f 100644
--- a/code/icarus/IcarusImplementation.cpp
+++ b/code/icarus/IcarusImplementation.cpp
@@ -716,12 +716,19 @@ int CIcarus::Load()
        const unsigned char* sg_buffer_data = static_cast<const unsigned char*>(
                saved_game.get_buffer_data());
 
-       const int sg_buffer_size = saved_game.get_buffer_size();
+       int sg_buffer_size = saved_game.get_buffer_size();
 
-       std::uninitialized_copy_n(
-               sg_buffer_data,
-               sg_buffer_size,
-               m_byBuffer);
+       if (sg_buffer_size < 0 || static_cast<size_t>(sg_buffer_size) >= 
sizeof(m_byBuffer))
+       {
+               sg_buffer_size = 0;
+       }
+       else
+       {
+               std::uninitialized_copy_n(
+                       sg_buffer_data,
+                       sg_buffer_size,
+                       m_byBuffer);
+       }
 
        //Load all signals
        if ( LoadSignals() == false )
@@ -849,12 +856,19 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long 
ulNumBytesToRead )
                const unsigned char* sg_buffer_data = static_cast<const 
unsigned char*>(
                        saved_game.get_buffer_data());
 
-               const int sg_buffer_size = saved_game.get_buffer_size();
+               int sg_buffer_size = saved_game.get_buffer_size();
 
-               std::uninitialized_copy_n(
-                       sg_buffer_data,
-                       sg_buffer_size,
-                       m_byBuffer);
+               if (sg_buffer_size < 0 || static_cast<size_t>(sg_buffer_size) 
>= sizeof(m_byBuffer))
+               {
+                       sg_buffer_size = 0;
+               }
+               else
+               {
+                       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 7797b5f..25c99cd 100644
--- a/codeJK2/game/Q3_Registers.cpp
+++ b/codeJK2/game/Q3_Registers.cpp
@@ -408,6 +408,11 @@ void Q3_VariableLoadFloats( varFloat_m &fmap )
                        INT_ID('F', 'I', 'D', 'L'),
                        idSize);
 
+               if (idSize < 0 || static_cast<size_t>(idSize) >= 
sizeof(tempBuffer))
+               {
+                       idSize = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('F', 'I', 'D', 'S'),
                        tempBuffer,
@@ -453,6 +458,11 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap )
                        INT_ID('S', 'I', 'D', 'L'),
                        idSize);
 
+               if (idSize < 0 || static_cast<size_t>(idSize) >= 
sizeof(tempBuffer))
+               {
+                       idSize = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('S', 'I', 'D', 'S'),
                        tempBuffer,
@@ -464,6 +474,11 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap )
                        INT_ID('S', 'V', 'S', 'Z'),
                        idSize);
 
+               if (idSize < 0 || static_cast<size_t>(idSize) >= 
sizeof(tempBuffer2))
+               {
+                       idSize = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('S', 'V', 'A', 'L'),
                        tempBuffer2,
diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp
index 7eb1bd1..b5c0240 100644
--- a/codeJK2/game/g_roff.cpp
+++ b/codeJK2/game/g_roff.cpp
@@ -678,6 +678,11 @@ void G_LoadCachedRoffs()
                        INT_ID('S', 'L', 'E', 'N'),
                        len);
 
+               if (len < 0 || static_cast<size_t>(len) >= sizeof(buffer))
+               {
+                       len = 0;
+               }
+
                saved_game.read_chunk(
                        INT_ID('R', 'S', 'T', 'R'),
                        buffer,

-- 
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

Reply via email to