Index: core/src/fxcrt/extension.h |
diff --git a/core/src/fxcrt/extension.h b/core/src/fxcrt/extension.h |
index 8d9597bfd15f155809cb8d35cacb0f5756665eca..eed303f669702cd23c3a9c0e4a831cf75218c24f 100644 |
--- a/core/src/fxcrt/extension.h |
+++ b/core/src/fxcrt/extension.h |
@@ -6,6 +6,9 @@ |
#ifndef _FXCRT_EXTENSION_IMP_ |
#define _FXCRT_EXTENSION_IMP_ |
+ |
+const size_t MAX_SIZE_T = size_t(-1); |
+ |
class IFXCRT_FileAccess |
{ |
public: |
@@ -194,7 +197,7 @@ public: |
} |
virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size) |
{ |
- if (offset < 0 || (size_t)(offset + size) > m_nCurSize) { |
+ if (offset < 0 || offset + size > m_nCurSize) { |
return FALSE; |
} |
m_nOffset = (size_t)offset, m_nSize = (size_t)size; |
@@ -214,6 +217,10 @@ public: |
if (m_bUseRange) { |
offset += (FX_FILESIZE)m_nOffset; |
} |
+ |
+ if(offset > MAX_SIZE_T - size) |
+ return FALSE; |
+ |
if ((size_t)offset + size > m_nCurSize) { |
return FALSE; |
} |
@@ -263,6 +270,9 @@ public: |
offset += (FX_FILESIZE)m_nOffset; |
} |
if (m_dwFlags & FX_MEMSTREAM_Consecutive) { |
+ if(offset > MAX_SIZE_T - size) |
+ return FALSE; |
+ |
m_nCurPos = (size_t)offset + size; |
if (m_nCurPos > m_nTotalSize) { |
IFX_Allocator* pAllocator = m_Blocks.m_pAllocator; |
@@ -284,6 +294,10 @@ public: |
} |
return TRUE; |
} |
+ |
+ if(offset > MAX_SIZE_T - size) |
+ return FALSE; |
+ |
if (!ExpandBlocks((size_t)offset + size)) { |
return FALSE; |
} |