Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Unified Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp

Issue 1306793002: Fix infinite loop for objects that reference themselves. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: GetRefObjNum Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
index 592a7b13265dc3fb403734af9ca9db9ae0d84823..e1e821c4c5e3d1c0d22bc36cee94ff2f9c403106 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -53,7 +53,7 @@ CFX_ByteString CPDF_Object::GetString() const {
break;
}
CPDF_Object* pObj =
- pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
if (pObj == NULL) {
return CFX_ByteString();
}
@@ -76,7 +76,7 @@ CFX_ByteStringC CPDF_Object::GetConstString() const {
break;
}
CPDF_Object* pObj =
- pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
if (pObj == NULL) {
return CFX_ByteStringC();
}
@@ -95,7 +95,7 @@ FX_FLOAT CPDF_Object::GetNumber() const {
break;
}
CPDF_Object* pObj =
- pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
if (pObj == NULL) {
return 0;
}
@@ -125,7 +125,7 @@ int CPDF_Object::GetInteger() const {
return 0;
}
CPDF_Object* pObj =
- pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);
+ pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), &context);
if (pObj == NULL) {
return 0;
}
@@ -134,6 +134,7 @@ int CPDF_Object::GetInteger() const {
}
return 0;
}
+
CPDF_Dictionary* CPDF_Object::GetDict() const {
switch (m_Type) {
case PDFOBJ_DICTIONARY:
@@ -142,19 +143,19 @@ CPDF_Dictionary* CPDF_Object::GetDict() const {
return ((CPDF_Stream*)this)->GetDict();
case PDFOBJ_REFERENCE: {
CPDF_Reference* pRef = (CPDF_Reference*)this;
- if (pRef->m_pObjList == NULL) {
- break;
- }
- CPDF_Object* pObj =
- pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
- if (pObj == NULL) {
- return NULL;
- }
+ CPDF_IndirectObjects* pIndirect = pRef->GetObjList();
+ if (!pIndirect)
+ return nullptr;
+ CPDF_Object* pObj = pIndirect->GetIndirectObject(pRef->GetRefObjNum());
+ if (!pObj || (pObj == this))
+ return nullptr;
return pObj->GetDict();
}
+ default:
+ return nullptr;
}
- return NULL;
}
+
CPDF_Array* CPDF_Object::GetArray() const {
if (m_Type == PDFOBJ_ARRAY)
return (CPDF_Array*)this;
@@ -184,7 +185,7 @@ int CPDF_Object::GetDirectType() const {
return m_Type;
}
CPDF_Reference* pRef = (CPDF_Reference*)this;
- return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);
+ return pRef->m_pObjList->GetIndirectType(pRef->GetRefObjNum());
}
FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const {
if (this == pOther) {
@@ -232,7 +233,7 @@ CPDF_Object* CPDF_Object::GetDirect() const {
if (pRef->m_pObjList == NULL) {
return NULL;
}
- return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ return pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
}
CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const {
CFX_MapPtrToPtr visited;
@@ -289,7 +290,7 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect,
}
case PDFOBJ_REFERENCE: {
CPDF_Reference* pRef = (CPDF_Reference*)this;
- FX_DWORD obj_num = pRef->m_RefObjNum;
+ FX_DWORD obj_num = pRef->GetRefObjNum();
if (bDirect && !visited->GetValueAt((void*)(uintptr_t)obj_num)) {
visited->SetAt((void*)(uintptr_t)obj_num, (void*)1);
if (!pRef->GetDirect())
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698