summaryrefslogtreecommitdiff
path: root/xfa/fgas
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fgas')
-rw-r--r--xfa/fgas/crt/fgas_memory.cpp254
-rw-r--r--xfa/fgas/crt/fgas_memory.h53
-rw-r--r--xfa/fgas/crt/fgas_utils.cpp4
-rw-r--r--xfa/fgas/crt/fgas_utils.h21
-rw-r--r--xfa/fgas/font/cfgas_fontmgr.h1
-rw-r--r--xfa/fgas/layout/fgas_rtfbreak.h5
-rw-r--r--xfa/fgas/layout/fgas_textbreak.h2
7 files changed, 15 insertions, 325 deletions
diff --git a/xfa/fgas/crt/fgas_memory.cpp b/xfa/fgas/crt/fgas_memory.cpp
deleted file mode 100644
index 9625f95203..0000000000
--- a/xfa/fgas/crt/fgas_memory.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fgas/crt/fgas_memory.h"
-
-#ifndef MEMORY_TOOL_REPLACES_ALLOCATOR
-// 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>
-
-namespace {
-
-struct FX_STATICSTORECHUNK {
- FX_STATICSTORECHUNK* pNextChunk;
- size_t iChunkSize;
- size_t iFreeSize;
-};
-
-class CFX_StaticStore : public IFX_MemoryAllocator, public CFX_Target {
- public:
- explicit CFX_StaticStore(size_t iDefChunkSize);
- ~CFX_StaticStore() override;
-
- void* Alloc(size_t size) override;
- void Free(void* pBlock) override {}
-
- private:
- size_t m_iAllocatedSize;
- size_t m_iDefChunkSize;
- FX_STATICSTORECHUNK* m_pChunk;
- FX_STATICSTORECHUNK* m_pLastChunk;
- FX_STATICSTORECHUNK* AllocChunk(size_t size);
- 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; }
-
- FX_FIXEDSTORECHUNK* pNextChunk;
- size_t iChunkSize;
- size_t iFreeNum;
-};
-
-class CFX_FixedStore : public IFX_MemoryAllocator, public CFX_Target {
- public:
- CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk);
- ~CFX_FixedStore() override;
- void* Alloc(size_t size) override;
- void Free(void* pBlock) override;
-
- private:
- FX_FIXEDSTORECHUNK* AllocChunk();
-
- size_t m_iBlockSize;
- size_t m_iDefChunkSize;
- FX_FIXEDSTORECHUNK* m_pChunk;
-};
-
-#endif // MEMORY_TOOL_REPLACES_ALLOCATOR
-
-} // namespace
-
-#define FX_4BYTEALIGN(size) (((size) + 3) & ~3)
-
-std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
- FX_ALLOCTYPE eType,
- size_t chunkSize,
- size_t blockSize) {
- switch (eType) {
- case FX_ALLOCTYPE_Static:
- return std::unique_ptr<IFX_MemoryAllocator>(
- new CFX_StaticStore(chunkSize));
- case FX_ALLOCTYPE_Fixed:
-#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 nullptr;
- }
-}
-
-CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize)
- : m_iAllocatedSize(0),
- m_iDefChunkSize(iDefChunkSize),
- m_pChunk(nullptr),
- m_pLastChunk(nullptr) {
- ASSERT(m_iDefChunkSize != 0);
-}
-
-CFX_StaticStore::~CFX_StaticStore() {
- FX_STATICSTORECHUNK* pChunk = m_pChunk;
- while (pChunk) {
- FX_STATICSTORECHUNK* pNext = pChunk->pNextChunk;
- FX_Free(pChunk);
- pChunk = pNext;
- }
-}
-
-FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) {
- ASSERT(size != 0);
- FX_STATICSTORECHUNK* pChunk = (FX_STATICSTORECHUNK*)FX_Alloc(
- uint8_t, sizeof(FX_STATICSTORECHUNK) + size);
- pChunk->iChunkSize = size;
- pChunk->iFreeSize = size;
- pChunk->pNextChunk = nullptr;
- if (!m_pLastChunk) {
- m_pChunk = pChunk;
- } else {
- m_pLastChunk->pNextChunk = pChunk;
- }
- m_pLastChunk = pChunk;
- return pChunk;
-}
-
-FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) {
- ASSERT(size != 0);
- if (!m_pLastChunk || m_pLastChunk->iFreeSize < size) {
- return AllocChunk(std::max(m_iDefChunkSize, size));
- }
- return m_pLastChunk;
-}
-
-void* CFX_StaticStore::Alloc(size_t size) {
- size = FX_4BYTEALIGN(size);
- ASSERT(size != 0);
- FX_STATICSTORECHUNK* pChunk = FindChunk(size);
- ASSERT(pChunk->iFreeSize >= size);
- uint8_t* p = (uint8_t*)pChunk;
- p += sizeof(FX_STATICSTORECHUNK) + pChunk->iChunkSize - pChunk->iFreeSize;
- pChunk->iFreeSize -= size;
- m_iAllocatedSize += size;
- return p;
-}
-
-#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) {
- FX_FIXEDSTORECHUNK* pNext = pChunk->pNextChunk;
- FX_Free(pChunk);
- pChunk = pNext;
- }
-}
-
-FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() {
- int32_t iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize +
- m_iBlockSize * m_iDefChunkSize;
- FX_FIXEDSTORECHUNK* pChunk =
- (FX_FIXEDSTORECHUNK*)FX_Alloc(uint8_t, iTotalSize);
- if (!pChunk)
- return nullptr;
-
- FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize);
- pChunk->pNextChunk = m_pChunk;
- pChunk->iChunkSize = m_iDefChunkSize;
- pChunk->iFreeNum = m_iDefChunkSize;
- m_pChunk = pChunk;
- return pChunk;
-}
-
-void* CFX_FixedStore::Alloc(size_t size) {
- if (size > m_iBlockSize) {
- return nullptr;
- }
- FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
- while (pChunk) {
- if (pChunk->iFreeNum > 0) {
- break;
- }
- pChunk = pChunk->pNextChunk;
- }
- if (!pChunk) {
- pChunk = AllocChunk();
- }
- uint8_t* pFlags = pChunk->FirstFlag();
- size_t i = 0;
- for (; i < pChunk->iChunkSize; i++)
- if (pFlags[i] == 0) {
- break;
- }
- ASSERT(i < pChunk->iChunkSize);
- pFlags[i] = 1;
- pChunk->iFreeNum--;
- return pChunk->FirstBlock() + i * m_iBlockSize;
-}
-
-void CFX_FixedStore::Free(void* pBlock) {
- FX_FIXEDSTORECHUNK* pPrior = nullptr;
- FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
- uint8_t* pStart = nullptr;
- uint8_t* pEnd;
- while (pChunk) {
- pStart = pChunk->FirstBlock();
- if (pBlock >= pStart) {
- pEnd = pStart + m_iBlockSize * pChunk->iChunkSize;
- if (pBlock < pEnd) {
- break;
- }
- }
- pPrior = pChunk, pChunk = pChunk->pNextChunk;
- }
- ASSERT(pChunk);
- size_t iPos = ((uint8_t*)pBlock - pStart) / m_iBlockSize;
- ASSERT(iPos < pChunk->iChunkSize);
- uint8_t* pFlags = pChunk->FirstFlag();
- if (pFlags[iPos] == 0) {
- return;
- }
- pFlags[iPos] = 0;
- pChunk->iFreeNum++;
- if (pChunk->iFreeNum == pChunk->iChunkSize) {
- if (!pPrior) {
- m_pChunk = pChunk->pNextChunk;
- } else {
- pPrior->pNextChunk = pChunk->pNextChunk;
- }
- FX_Free(pChunk);
- }
-}
-
-#endif // MEMORY_TOOL_REPLACES_ALLOCATOR
diff --git a/xfa/fgas/crt/fgas_memory.h b/xfa/fgas/crt/fgas_memory.h
deleted file mode 100644
index 4e4e33f7fc..0000000000
--- a/xfa/fgas/crt/fgas_memory.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FGAS_CRT_FGAS_MEMORY_H_
-#define XFA_FGAS_CRT_FGAS_MEMORY_H_
-
-#include <memory>
-
-#include "core/fxcrt/fx_memory.h"
-#include "core/fxcrt/fx_system.h"
-
-enum FX_ALLOCTYPE {
- FX_ALLOCTYPE_Static,
- FX_ALLOCTYPE_Fixed,
-};
-
-class IFX_MemoryAllocator {
- public:
- virtual ~IFX_MemoryAllocator() {}
- virtual void* Alloc(size_t size) = 0;
- virtual void Free(void* pBlock) = 0;
-
- static std::unique_ptr<IFX_MemoryAllocator> Create(FX_ALLOCTYPE eType,
- size_t chunkSize,
- size_t blockSize);
-};
-
-class CFX_Target {
- public:
- virtual ~CFX_Target() {}
- void* operator new(size_t size) { return FX_Alloc(uint8_t, size); }
- void operator delete(void* p) { FX_Free(p); }
- void* operator new(size_t size, IFX_MemoryAllocator* pAllocator) {
- return pAllocator->Alloc(size);
- }
- void operator delete(void* p, IFX_MemoryAllocator* pAllocator) {
- pAllocator->Free(p);
- }
- void* operator new(size_t size, void* place) { return place; }
- void operator delete(void* p, void* place) {}
-};
-
-#define FXTARGET_NewWith(__allocator__) new (__allocator__)
-#define FXTARGET_DeleteWith(__class__, __allocator__, pointer) \
- { \
- (pointer)->~__class__(); \
- (pointer)->operator delete((pointer), (__allocator__)); \
- }
-
-#endif // XFA_FGAS_CRT_FGAS_MEMORY_H_
diff --git a/xfa/fgas/crt/fgas_utils.cpp b/xfa/fgas/crt/fgas_utils.cpp
index 0cdbf77d31..1e86c6c16a 100644
--- a/xfa/fgas/crt/fgas_utils.cpp
+++ b/xfa/fgas/crt/fgas_utils.cpp
@@ -10,10 +10,10 @@
#include "core/fxcrt/fx_basic.h"
-class FX_BASEARRAYDATA : public CFX_Target {
+class FX_BASEARRAYDATA {
public:
FX_BASEARRAYDATA(int32_t growsize, int32_t blocksize);
- ~FX_BASEARRAYDATA() override;
+ ~FX_BASEARRAYDATA();
int32_t iGrowSize;
int32_t iBlockSize;
diff --git a/xfa/fgas/crt/fgas_utils.h b/xfa/fgas/crt/fgas_utils.h
index c7bc45f73d..465601149b 100644
--- a/xfa/fgas/crt/fgas_utils.h
+++ b/xfa/fgas/crt/fgas_utils.h
@@ -8,14 +8,13 @@
#define XFA_FGAS_CRT_FGAS_UTILS_H_
#include "core/fxcrt/fx_coordinates.h"
-#include "xfa/fgas/crt/fgas_memory.h"
class FX_BASEARRAYDATA;
-class CFX_BaseArray : public CFX_Target {
+class CFX_BaseArray {
protected:
CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize);
- ~CFX_BaseArray() override;
+ ~CFX_BaseArray();
int32_t GetSize() const;
int32_t GetBlockSize() const;
@@ -77,10 +76,10 @@ class CFX_BaseArrayTemplate : public CFX_BaseArray {
void RemoveAll(bool bLeaveMemory) { CFX_BaseArray::RemoveAll(bLeaveMemory); }
};
-class CFX_BaseMassArrayImp : public CFX_Target {
+class CFX_BaseMassArrayImp {
public:
CFX_BaseMassArrayImp(int32_t iChunkSize, int32_t iBlockSize);
- ~CFX_BaseMassArrayImp() override;
+ ~CFX_BaseMassArrayImp();
uint8_t* AddSpace() { return AddSpaceTo(m_iBlockCount); }
uint8_t* AddSpaceTo(int32_t index);
@@ -105,10 +104,10 @@ class CFX_BaseMassArrayImp : public CFX_Target {
int32_t iSrcCount);
};
-class CFX_BaseMassArray : public CFX_Target {
+class CFX_BaseMassArray {
protected:
CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize);
- ~CFX_BaseMassArray() override;
+ ~CFX_BaseMassArray();
int32_t GetSize() const;
uint8_t* AddSpaceTo(int32_t index);
@@ -251,10 +250,10 @@ class CFX_ObjectMassArrayTemplate : public CFX_BaseMassArray {
}
};
-class CFX_BaseDiscreteArray : public CFX_Target {
+class CFX_BaseDiscreteArray {
protected:
CFX_BaseDiscreteArray(int32_t iChunkSize, int32_t iBlockSize);
- ~CFX_BaseDiscreteArray() override;
+ ~CFX_BaseDiscreteArray();
uint8_t* AddSpaceTo(int32_t index);
uint8_t* GetAt(int32_t index) const;
@@ -281,10 +280,10 @@ class CFX_DiscreteArrayTemplate : public CFX_BaseDiscreteArray {
void RemoveAll() { CFX_BaseDiscreteArray::RemoveAll(); }
};
-class CFX_BaseStack : public CFX_Target {
+class CFX_BaseStack {
protected:
CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize);
- ~CFX_BaseStack() override;
+ ~CFX_BaseStack();
uint8_t* Push();
void Pop();
diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h
index 5e03af031f..1dadfd347e 100644
--- a/xfa/fgas/font/cfgas_fontmgr.h
+++ b/xfa/fgas/font/cfgas_fontmgr.h
@@ -21,7 +21,6 @@
#include "xfa/fgas/crt/fgas_stream.h"
#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-#include "xfa/fgas/crt/fgas_memory.h"
#include "xfa/fgas/crt/fgas_utils.h"
#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h
index c281192553..6edd860354 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.h
+++ b/xfa/fgas/layout/fgas_rtfbreak.h
@@ -11,7 +11,6 @@
#include "core/fxcrt/fx_basic.h"
#include "core/fxcrt/fx_ucd.h"
-#include "xfa/fgas/crt/fgas_memory.h"
#include "xfa/fgas/crt/fgas_utils.h"
#include "xfa/fgas/layout/fgas_textbreak.h"
#include "xfa/fgas/layout/fgas_unicode.h"
@@ -83,10 +82,10 @@ struct FX_RTFTEXTOBJ {
int32_t iVerticalScale;
};
-class CFX_RTFPiece : public CFX_Target {
+class CFX_RTFPiece {
public:
CFX_RTFPiece();
- ~CFX_RTFPiece() override;
+ ~CFX_RTFPiece();
void AppendChar(const CFX_RTFChar& tc) {
ASSERT(m_pChars);
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
index 36602749c7..7359600c14 100644
--- a/xfa/fgas/layout/fgas_textbreak.h
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -105,7 +105,7 @@ struct FX_TXTRUN {
bool bSkipSpace;
};
-class CFX_TxtPiece : public CFX_Target {
+class CFX_TxtPiece {
public:
CFX_TxtPiece();