Fix segv in CFX_BaseArray::~CFX_BaseArray
authorTom Sepez <tsepez@chromium.org>
Fri, 30 Oct 2015 18:20:00 +0000 (11:20 -0700)
committerTom Sepez <tsepez@chromium.org>
Fri, 30 Oct 2015 18:20:00 +0000 (11:20 -0700)
One can't blatantly memset() a class to zero if its
parent contains a vtable.

Fix some IWYU along the way.
Kill some casts along the way.

BUG=pdfium:259
R=thestig@chromium.org

Review URL: https://codereview.chromium.org/1416943007 .

xfa/src/fgas/include/fx_mem.h
xfa/src/fgas/include/fx_utl.h
xfa/src/fgas/src/crt/fx_utils.cpp

index fe52489..313fc93 100644 (file)
@@ -6,6 +6,9 @@
 \r
 #ifndef _FX_MEMORY\r
 #define _FX_MEMORY\r
+\r
+#include "../../../../core/include/fxcrt/fx_memory.h"  // For FX_Alloc().\r
+\r
 class IFX_MEMAllocator;\r
 class CFX_Target;\r
 enum FX_ALLOCTYPE {\r
index 86a516b..e4fcf78 100644 (file)
@@ -6,6 +6,10 @@
 \r
 #ifndef _FX_UTILS\r
 #define _FX_UTILS\r
+\r
+#include "fx_mem.h"\r
+#include "../../../../core/include/fxcrt/fx_coordinates.h"  // For CFX_Rect.\r
+\r
 class CFX_ThreadLock;\r
 class CFX_BaseArray;\r
 template <class baseType>\r
@@ -30,6 +34,8 @@ template <class baseType>
 class CFX_CPLTreeNode;\r
 template <class baseType>\r
 class CFX_CPLTree;\r
+class FX_BASEARRAYDATA;\r
+\r
 class CFX_ThreadLock {\r
  public:\r
   CFX_ThreadLock();\r
@@ -43,7 +49,6 @@ class CFX_ThreadLock {
 class CFX_BaseArray : public CFX_Target {\r
  protected:\r
   CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize);\r
-  ~CFX_BaseArray();\r
   int32_t GetSize() const;\r
   int32_t GetBlockSize() const;\r
   uint8_t* AddSpaceTo(int32_t index);\r
@@ -57,7 +62,8 @@ class CFX_BaseArray : public CFX_Target {
                int32_t iCount = -1);\r
   int32_t RemoveLast(int32_t iCount = -1);\r
   void RemoveAll(FX_BOOL bLeaveMemory = FALSE);\r
-  void* m_pData;\r
+\r
+  FX_BASEARRAYDATA* m_pData;\r
 };\r
 template <class baseType>\r
 class CFX_BaseArrayTemplate : public CFX_BaseArray {\r
index 1b5cb6d..95f9e5c 100644 (file)
@@ -4,77 +4,76 @@
 \r
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
 \r
+#include "../../include/fx_utl.h"\r
 #include "../fgas_base.h"\r
 #include "fx_utils.h"\r
+\r
 CFX_ThreadLock::CFX_ThreadLock() : m_pData(NULL) {}\r
 CFX_ThreadLock::~CFX_ThreadLock() {}\r
 void CFX_ThreadLock::Lock() {}\r
 void CFX_ThreadLock::Unlock() {}\r
-typedef struct _FX_BASEARRAYDATA : public CFX_Target {\r
+class FX_BASEARRAYDATA : public CFX_Target {\r
+ public:\r
+  FX_BASEARRAYDATA(int32_t growsize, int32_t blocksize)\r
+      : iGrowSize(growsize),\r
+        iBlockSize(blocksize),\r
+        iTotalCount(0),\r
+        iBlockCount(0),\r
+        pBuffer(nullptr) {}\r
+\r
+  ~FX_BASEARRAYDATA() { FX_Free(pBuffer); }\r
+\r
   int32_t iGrowSize;\r
   int32_t iBlockSize;\r
   int32_t iTotalCount;\r
   int32_t iBlockCount;\r
   uint8_t* pBuffer;\r
-} FX_BASEARRAYDATA, *FX_LPBASEARRAYDATA;\r
-typedef FX_BASEARRAYDATA const* FX_LPCBASEARRAYDATA;\r
+};\r
 CFX_BaseArray::CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize) {\r
   FXSYS_assert(iGrowSize > 0 && iBlockSize > 0);\r
-  m_pData = new FX_BASEARRAYDATA;\r
-  FX_memset(m_pData, 0, sizeof(FX_BASEARRAYDATA));\r
-  ((FX_LPBASEARRAYDATA)m_pData)->iGrowSize = iGrowSize;\r
-  ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize = iBlockSize;\r
-}\r
-CFX_BaseArray::~CFX_BaseArray() {\r
-  FX_LPBASEARRAYDATA pData = (FX_LPBASEARRAYDATA)m_pData;\r
-  if (pData->pBuffer != NULL) {\r
-    FX_Free(pData->pBuffer);\r
-  }\r
-  delete pData;\r
+  m_pData = new FX_BASEARRAYDATA(iGrowSize, iBlockSize);\r
 }\r
 int32_t CFX_BaseArray::GetSize() const {\r
-  return ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount;\r
+  return m_pData->iBlockCount;\r
 }\r
 int32_t CFX_BaseArray::GetBlockSize() const {\r
-  return ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize;\r
+  return m_pData->iBlockSize;\r
 }\r
 uint8_t* CFX_BaseArray::AddSpaceTo(int32_t index) {\r
   FXSYS_assert(index > -1);\r
-  uint8_t*& pBuffer = ((FX_LPBASEARRAYDATA)m_pData)->pBuffer;\r
-  int32_t& iTotalCount = ((FX_LPBASEARRAYDATA)m_pData)->iTotalCount;\r
-  int32_t iBlockSize = ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize;\r
+  uint8_t*& pBuffer = m_pData->pBuffer;\r
+  int32_t& iTotalCount = m_pData->iTotalCount;\r
+  int32_t iBlockSize = m_pData->iBlockSize;\r
   if (index >= iTotalCount) {\r
-    int32_t iGrowSize = ((FX_LPBASEARRAYDATA)m_pData)->iGrowSize;\r
+    int32_t iGrowSize = m_pData->iGrowSize;\r
     iTotalCount = (index / iGrowSize + 1) * iGrowSize;\r
     int32_t iNewSize = iTotalCount * iBlockSize;\r
     if (pBuffer == NULL) {\r
-      pBuffer = (uint8_t*)FX_Alloc(uint8_t, iNewSize);\r
+      pBuffer = FX_Alloc(uint8_t, iNewSize);\r
     } else {\r
-      pBuffer = (uint8_t*)FX_Realloc(uint8_t, pBuffer, iNewSize);\r
+      pBuffer = FX_Realloc(uint8_t, pBuffer, iNewSize);\r
     }\r
   }\r
   FXSYS_assert(pBuffer != NULL);\r
-  int32_t& iBlockCount = ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount;\r
+  int32_t& iBlockCount = m_pData->iBlockCount;\r
   if (index >= iBlockCount) {\r
     iBlockCount = index + 1;\r
   }\r
   return pBuffer + index * iBlockSize;\r
 }\r
 uint8_t* CFX_BaseArray::GetAt(int32_t index) const {\r
-  FXSYS_assert(index > -1 &&\r
-               index < ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount);\r
-  return ((FX_LPBASEARRAYDATA)m_pData)->pBuffer +\r
-         index * ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize;\r
+  FXSYS_assert(index > -1 && index < m_pData->iBlockCount);\r
+  return m_pData->pBuffer + index * m_pData->iBlockSize;\r
 }\r
 uint8_t* CFX_BaseArray::GetBuffer() const {\r
-  return ((FX_LPBASEARRAYDATA)m_pData)->pBuffer;\r
+  return m_pData->pBuffer;\r
 }\r
 int32_t CFX_BaseArray::Append(const CFX_BaseArray& src,\r
                               int32_t iStart,\r
                               int32_t iCount) {\r
-  int32_t iBlockSize = ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize;\r
-  FXSYS_assert(iBlockSize == ((FX_LPBASEARRAYDATA)src.m_pData)->iBlockSize);\r
-  int32_t& iBlockCount = ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount;\r
+  int32_t iBlockSize = m_pData->iBlockSize;\r
+  FXSYS_assert(iBlockSize == src.m_pData->iBlockSize);\r
+  int32_t& iBlockCount = m_pData->iBlockCount;\r
   int32_t iAdded = src.GetSize();\r
   FXSYS_assert(iStart > -1 && iStart < iAdded);\r
   if (iCount < 0) {\r
@@ -86,19 +85,17 @@ int32_t CFX_BaseArray::Append(const CFX_BaseArray& src,
   if (iCount < 1) {\r
     return 0;\r
   }\r
-  uint8_t* pDst =\r
-      ((FX_LPBASEARRAYDATA)m_pData)->pBuffer + iBlockCount * iBlockSize;\r
+  uint8_t* pDst = m_pData->pBuffer + iBlockCount * iBlockSize;\r
   AddSpaceTo(iBlockCount + iCount - 1);\r
-  FX_memcpy(pDst,\r
-            ((FX_LPBASEARRAYDATA)src.m_pData)->pBuffer + iStart * iBlockSize,\r
+  FX_memcpy(pDst, src.m_pData->pBuffer + iStart * iBlockSize,\r
             iCount * iBlockSize);\r
   return iCount;\r
 }\r
 int32_t CFX_BaseArray::Copy(const CFX_BaseArray& src,\r
                             int32_t iStart,\r
                             int32_t iCount) {\r
-  int32_t iBlockSize = ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize;\r
-  FXSYS_assert(iBlockSize == ((FX_LPBASEARRAYDATA)src.m_pData)->iBlockSize);\r
+  int32_t iBlockSize = m_pData->iBlockSize;\r
+  FXSYS_assert(iBlockSize == src.m_pData->iBlockSize);\r
   int32_t iCopied = src.GetSize();\r
   FXSYS_assert(iStart > -1 && iStart < iCopied);\r
   if (iCount < 0) {\r
@@ -112,13 +109,12 @@ int32_t CFX_BaseArray::Copy(const CFX_BaseArray& src,
   }\r
   RemoveAll(TRUE);\r
   AddSpaceTo(iCount - 1);\r
-  FX_memcpy(((FX_LPBASEARRAYDATA)m_pData)->pBuffer,\r
-            ((FX_LPBASEARRAYDATA)src.m_pData)->pBuffer + iStart * iBlockSize,\r
+  FX_memcpy(m_pData->pBuffer, src.m_pData->pBuffer + iStart * iBlockSize,\r
             iCount * iBlockSize);\r
   return iCount;\r
 }\r
 int32_t CFX_BaseArray::RemoveLast(int32_t iCount) {\r
-  int32_t& iBlockCount = ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount;\r
+  int32_t& iBlockCount = m_pData->iBlockCount;\r
   if (iCount < 0 || iCount > iBlockCount) {\r
     iCount = iBlockCount;\r
     iBlockCount = 0;\r
@@ -129,14 +125,14 @@ int32_t CFX_BaseArray::RemoveLast(int32_t iCount) {
 }\r
 void CFX_BaseArray::RemoveAll(FX_BOOL bLeaveMemory) {\r
   if (!bLeaveMemory) {\r
-    uint8_t*& pBuffer = ((FX_LPBASEARRAYDATA)m_pData)->pBuffer;\r
+    uint8_t*& pBuffer = m_pData->pBuffer;\r
     if (pBuffer != NULL) {\r
       FX_Free(pBuffer);\r
       pBuffer = NULL;\r
     }\r
-    ((FX_LPBASEARRAYDATA)m_pData)->iTotalCount = 0;\r
+    m_pData->iTotalCount = 0;\r
   }\r
-  ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount = 0;\r
+  m_pData->iBlockCount = 0;\r
 }\r
 CFX_BaseMassArrayImp::CFX_BaseMassArrayImp(int32_t iChunkSize,\r
                                            int32_t iBlockSize)\r