Fix NULL pointer dereference in CPDF_InterForm.
authorLei Zhang <thestig@chromium.org>
Sat, 3 Oct 2015 17:06:25 +0000 (10:06 -0700)
committerLei Zhang <thestig@chromium.org>
Sat, 3 Oct 2015 17:06:25 +0000 (10:06 -0700)
BUG=537772
R=tsepez@chromium.org

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

core/include/fpdfdoc/fpdf_doc.h
core/src/fpdfdoc/doc_form.cpp

index 0588a3a..b0c129b 100644 (file)
@@ -738,7 +738,7 @@ class CPDF_InterForm : public CFX_PrivateData {
   int CompareFieldName(const CFX_ByteString& name1,
                        const CFX_ByteString& name2);
 
-  CPDF_Document* m_pDocument;
+  CPDF_Document* const m_pDocument;
 
   FX_BOOL m_bGenerateAP;
 
@@ -746,7 +746,7 @@ class CPDF_InterForm : public CFX_PrivateData {
 
   std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
 
-  CFieldTree* m_pFieldTree;
+  nonstd::unique_ptr<CFieldTree> m_pFieldTree;
 
   CFX_ByteString m_bsEncoding;
 
index 970b4b9..17f1808 100644 (file)
@@ -233,21 +233,25 @@ CFieldTree::_Node* CFieldTree::FindNode(const CFX_WideString& full_name) {
   return pNode;
 }
 CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP)
-    : CFX_PrivateData() {
-  m_pDocument = pDocument;
-  m_bGenerateAP = bGenerateAP;
-  m_pFormNotify = NULL;
-  m_bUpdated = FALSE;
-  m_pFieldTree = new CFieldTree;
+    : CFX_PrivateData(),
+      m_pDocument(pDocument),
+      m_bGenerateAP(bGenerateAP),
+      m_pFormDict(nullptr),
+      m_pFieldTree(new CFieldTree),
+      m_pFormNotify(nullptr),
+      m_bUpdated(FALSE) {
   CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+  if (!pRoot)
+    return;
+
   m_pFormDict = pRoot->GetDict("AcroForm");
-  if (m_pFormDict == NULL) {
+  if (!m_pFormDict)
     return;
-  }
+
   CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
-  if (pFields == NULL) {
+  if (!pFields)
     return;
-  }
+
   int count = pFields->GetCount();
   for (int i = 0; i < count; i++) {
     LoadField(pFields->GetDict(i));
@@ -257,12 +261,10 @@ CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP)
 CPDF_InterForm::~CPDF_InterForm() {
   for (auto it : m_ControlMap)
     delete it.second;
-  if (m_pFieldTree) {
-    int nCount = m_pFieldTree->m_Root.CountFields();
-    for (int i = 0; i < nCount; ++i) {
-      delete m_pFieldTree->m_Root.GetField(i);
-    }
-    delete m_pFieldTree;
+
+  int nCount = m_pFieldTree->m_Root.CountFields();
+  for (int i = 0; i < nCount; ++i) {
+    delete m_pFieldTree->m_Root.GetField(i);
   }
 }