Index: xfa/fgas/crt/fgas_memory.cpp |
diff --git a/xfa/fgas/crt/fgas_memory.cpp b/xfa/fgas/crt/fgas_memory.cpp |
index e587f5a5b0d49d1f3196773676857bf197086255..c68241fcf162211e7798c8ed20d40b410cfb8c3e 100644 |
--- a/xfa/fgas/crt/fgas_memory.cpp |
+++ b/xfa/fgas/crt/fgas_memory.cpp |
@@ -7,35 +7,14 @@ |
#include "xfa/fgas/crt/fgas_memory.h" |
#ifndef MEMORY_TOOL_REPLACES_ALLOCATOR |
-#define MEMORY_TOOL_REPLACES_ALLOCATOR // Temporary, for CF testing. |
+// Use CFX_DefStore to replace CFX_FixedStore to simplify memory |
+// management so that some problems such Use-After-Free can be |
+// detected by Asan or ClusterFuzz tools. |
+#define MEMORY_TOOL_REPLACES_ALLOCATOR |
#endif |
#include <algorithm> |
-#ifdef MEMORY_TOOL_REPLACES_ALLOCATOR |
- |
-namespace { |
- |
-class CFX_DefStore : public IFX_MemoryAllocator, public CFX_Target { |
- public: |
- CFX_DefStore() {} |
- ~CFX_DefStore() override {} |
- |
- void* Alloc(size_t size) override { return FX_Alloc(uint8_t, size); } |
- void Free(void* pBlock) override { FX_Free(pBlock); } |
-}; |
- |
-} // namespace |
- |
-std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create( |
- FX_ALLOCTYPE eType, |
- size_t chunkSize, |
- size_t blockSize) { |
- return std::unique_ptr<IFX_MemoryAllocator>(new CFX_DefStore()); |
-} |
- |
-#else // MEMORY_TOOL_REPLACES_ALLOCATOR |
- |
namespace { |
struct FX_STATICSTORECHUNK { |
@@ -61,6 +40,19 @@ class CFX_StaticStore : public IFX_MemoryAllocator, public CFX_Target { |
FX_STATICSTORECHUNK* FindChunk(size_t size); |
}; |
+#ifdef MEMORY_TOOL_REPLACES_ALLOCATOR |
+ |
+class CFX_DefStore : public IFX_MemoryAllocator, public CFX_Target { |
+ public: |
+ CFX_DefStore() {} |
+ ~CFX_DefStore() override {} |
+ |
+ void* Alloc(size_t size) override { return FX_Alloc(uint8_t, size); } |
+ void Free(void* pBlock) override { FX_Free(pBlock); } |
+}; |
+ |
+#else |
+ |
struct FX_FIXEDSTORECHUNK { |
uint8_t* FirstFlag() { return reinterpret_cast<uint8_t*>(this + 1); } |
uint8_t* FirstBlock() { return FirstFlag() + iChunkSize; } |
@@ -85,6 +77,8 @@ class CFX_FixedStore : public IFX_MemoryAllocator, public CFX_Target { |
FX_FIXEDSTORECHUNK* m_pChunk; |
}; |
+#endif // MEMORY_TOOL_REPLACES_ALLOCATOR |
+ |
} // namespace |
#define FX_4BYTEALIGN(size) (((size) + 3) & ~3) |
@@ -98,7 +92,12 @@ std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create( |
return std::unique_ptr<IFX_MemoryAllocator>( |
new CFX_StaticStore(chunkSize)); |
case FX_ALLOCTYPE_Fixed: |
- return std::unique_ptr<IFX_MemoryAllocator>(new CFX_FixedStore(blockSize, chunkSize); |
+#ifdef MEMORY_TOOL_REPLACES_ALLOCATOR |
+ return std::unique_ptr<IFX_MemoryAllocator>(new CFX_DefStore()); |
+#else |
+ return std::unique_ptr<IFX_MemoryAllocator>( |
+ new CFX_FixedStore(blockSize, chunkSize)); |
+#endif // MEMORY_TOOL_REPLACES_ALLOCATOR |
default: |
ASSERT(0); |
return std::unique_ptr<IFX_MemoryAllocator>(); |
@@ -112,6 +111,7 @@ CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize) |
m_pLastChunk(nullptr) { |
ASSERT(m_iDefChunkSize != 0); |
} |
+ |
CFX_StaticStore::~CFX_StaticStore() { |
FX_STATICSTORECHUNK* pChunk = m_pChunk; |
while (pChunk) { |
@@ -120,6 +120,7 @@ CFX_StaticStore::~CFX_StaticStore() { |
pChunk = pNext; |
} |
} |
+ |
FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) { |
ASSERT(size != 0); |
FX_STATICSTORECHUNK* pChunk = (FX_STATICSTORECHUNK*)FX_Alloc( |
@@ -135,6 +136,7 @@ FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) { |
m_pLastChunk = pChunk; |
return pChunk; |
} |
+ |
FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) { |
ASSERT(size != 0); |
if (!m_pLastChunk || m_pLastChunk->iFreeSize < size) { |
@@ -142,6 +144,7 @@ FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) { |
} |
return m_pLastChunk; |
} |
+ |
void* CFX_StaticStore::Alloc(size_t size) { |
size = FX_4BYTEALIGN(size); |
ASSERT(size != 0); |
@@ -153,18 +156,16 @@ void* CFX_StaticStore::Alloc(size_t size) { |
m_iAllocatedSize += size; |
return p; |
} |
-size_t CFX_StaticStore::SetDefChunkSize(size_t size) { |
- ASSERT(size != 0); |
- size_t v = m_iDefChunkSize; |
- m_iDefChunkSize = size; |
- return v; |
-} |
+ |
+#ifndef MEMORY_TOOL_REPLACES_ALLOCATOR |
+ |
CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk) |
: m_iBlockSize(FX_4BYTEALIGN(iBlockSize)), |
m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)), |
m_pChunk(nullptr) { |
ASSERT(m_iBlockSize != 0 && m_iDefChunkSize != 0); |
} |
+ |
CFX_FixedStore::~CFX_FixedStore() { |
FX_FIXEDSTORECHUNK* pChunk = m_pChunk; |
while (pChunk) { |
@@ -173,6 +174,7 @@ CFX_FixedStore::~CFX_FixedStore() { |
pChunk = pNext; |
} |
} |
+ |
FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() { |
int32_t iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize + |
m_iBlockSize * m_iDefChunkSize; |
@@ -188,6 +190,7 @@ FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() { |
m_pChunk = pChunk; |
return pChunk; |
} |
+ |
void* CFX_FixedStore::Alloc(size_t size) { |
if (size > m_iBlockSize) { |
return nullptr; |
@@ -213,6 +216,7 @@ void* CFX_FixedStore::Alloc(size_t size) { |
pChunk->iFreeNum--; |
return pChunk->FirstBlock() + i * m_iBlockSize; |
} |
+ |
void CFX_FixedStore::Free(void* pBlock) { |
FX_FIXEDSTORECHUNK* pPrior = nullptr; |
FX_FIXEDSTORECHUNK* pChunk = m_pChunk; |
@@ -246,11 +250,5 @@ void CFX_FixedStore::Free(void* pBlock) { |
FX_Free(pChunk); |
} |
} |
-size_t CFX_FixedStore::SetDefChunkSize(size_t iChunkSize) { |
- ASSERT(iChunkSize != 0); |
- size_t v = m_iDefChunkSize; |
- m_iDefChunkSize = FX_4BYTEALIGN(iChunkSize); |
- return v; |
-} |
#endif // MEMORY_TOOL_REPLACES_ALLOCATOR |