Index: core/fpdfapi/fpdf_parser/cpdf_parser.cpp |
diff --git a/core/fpdfapi/fpdf_parser/cpdf_parser.cpp b/core/fpdfapi/fpdf_parser/cpdf_parser.cpp |
index e2bab450bee351722c5792c953cff38ecd380bce..9d26104caa4c59069293c641d09d69166d83e8db 100644 |
--- a/core/fpdfapi/fpdf_parser/cpdf_parser.cpp |
+++ b/core/fpdfapi/fpdf_parser/cpdf_parser.cpp |
@@ -51,7 +51,8 @@ int32_t GetStreamFirst(CPDF_StreamAcc* pObjStream) { |
} // namespace |
CPDF_Parser::CPDF_Parser() |
- : m_bOwnFileRead(true), |
+ : m_bHasParsed(false), |
+ m_bOwnFileRead(true), |
m_FileVersion(0), |
m_pTrailer(nullptr), |
m_pEncryptDict(nullptr), |
@@ -63,7 +64,25 @@ CPDF_Parser::CPDF_Parser() |
} |
CPDF_Parser::~CPDF_Parser() { |
- CloseParser(); |
+ if (m_pTrailer) |
+ m_pTrailer->Release(); |
+ |
+ ReleaseEncryptHandler(); |
+ SetEncryptDictionary(nullptr); |
+ |
+ if (m_bOwnFileRead && m_pSyntax->m_pFileAccess) { |
+ m_pSyntax->m_pFileAccess->Release(); |
+ m_pSyntax->m_pFileAccess = nullptr; |
+ } |
+ |
+ int32_t iLen = m_Trailers.GetSize(); |
+ for (int32_t i = 0; i < iLen; ++i) { |
+ if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) |
+ trailer->Release(); |
+ } |
+ |
+ if (m_pLinearized) |
+ m_pLinearized->Release(); |
} |
uint32_t CPDF_Parser::GetLastObjNum() const { |
@@ -124,43 +143,10 @@ void CPDF_Parser::ShrinkObjectMap(uint32_t objnum) { |
m_ObjectInfo[objnum - 1].pos = 0; |
} |
-void CPDF_Parser::CloseParser() { |
- m_bVersionUpdated = false; |
- m_pDocument = nullptr; |
- |
- if (m_pTrailer) { |
- m_pTrailer->Release(); |
- m_pTrailer = nullptr; |
- } |
- ReleaseEncryptHandler(); |
- SetEncryptDictionary(nullptr); |
- |
- if (m_bOwnFileRead && m_pSyntax->m_pFileAccess) { |
- m_pSyntax->m_pFileAccess->Release(); |
- m_pSyntax->m_pFileAccess = nullptr; |
- } |
- |
- m_ObjectStreamMap.clear(); |
- m_ObjCache.clear(); |
- m_SortedOffset.clear(); |
- m_ObjectInfo.clear(); |
- |
- int32_t iLen = m_Trailers.GetSize(); |
- for (int32_t i = 0; i < iLen; ++i) { |
- if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) |
- trailer->Release(); |
- } |
- m_Trailers.RemoveAll(); |
- |
- if (m_pLinearized) { |
- m_pLinearized->Release(); |
- m_pLinearized = nullptr; |
- } |
-} |
- |
CPDF_Parser::Error CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, |
CPDF_Document* pDocument) { |
- CloseParser(); |
+ ASSERT(!m_bHasParsed); |
+ m_bHasParsed = true; |
m_bXRefStream = FALSE; |
m_LastXRefOffset = 0; |
@@ -1550,7 +1536,8 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, |
CPDF_Parser::Error CPDF_Parser::StartLinearizedParse(IFX_FileRead* pFileAccess, |
CPDF_Document* pDocument) { |
- CloseParser(); |
+ ASSERT(!m_bHasParsed); |
+ |
m_bXRefStream = FALSE; |
m_LastXRefOffset = 0; |
m_bOwnFileRead = true; |
@@ -1563,8 +1550,9 @@ CPDF_Parser::Error CPDF_Parser::StartLinearizedParse(IFX_FileRead* pFileAccess, |
m_pSyntax->m_pFileAccess = nullptr; |
return StartParse(pFileAccess, std::move(pDocument)); |
} |
- |
+ m_bHasParsed = true; |
m_pDocument = pDocument; |
+ |
FX_FILESIZE dwFirstXRefOffset = m_pSyntax->SavePos(); |
FX_BOOL bXRefRebuilt = FALSE; |