| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| index c705ea73576de248cec87e003635782a35a5ae99..5e926c31b940b9dd68e0d77e6097b5d7a937c8b0 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -78,7 +78,7 @@ void CPDF_Parser::CloseParser(FX_BOOL bReParse)
|
| }
|
| ReleaseEncryptHandler();
|
| SetEncryptDictionary(NULL);
|
| - if (m_bOwnFileRead && m_Syntax.m_pFileAccess != NULL) {
|
| + if (m_bOwnFileRead && m_Syntax.m_pFileAccess) {
|
| m_Syntax.m_pFileAccess->Release();
|
| m_Syntax.m_pFileAccess = NULL;
|
| }
|
| @@ -96,7 +96,8 @@ void CPDF_Parser::CloseParser(FX_BOOL bReParse)
|
| m_ObjVersion.RemoveAll();
|
| FX_INT32 iLen = m_Trailers.GetSize();
|
| for (FX_INT32 i = 0; i < iLen; ++i) {
|
| - m_Trailers.GetAt(i)->Release();
|
| + if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i))
|
| + trailer->Release();
|
| }
|
| m_Trailers.RemoveAll();
|
| if (m_pLinearized) {
|
| @@ -1110,7 +1111,7 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL
|
| }
|
| CPDF_Array* CPDF_Parser::GetIDArray()
|
| {
|
| - CPDF_Object* pID = m_pTrailer->GetElement(FX_BSTRC("ID"));
|
| + CPDF_Object* pID = m_pTrailer ? m_pTrailer->GetElement(FX_BSTRC("ID")) : NULL;
|
| if (pID == NULL) {
|
| return NULL;
|
| }
|
| @@ -1125,7 +1126,7 @@ CPDF_Array* CPDF_Parser::GetIDArray()
|
| }
|
| FX_DWORD CPDF_Parser::GetRootObjNum()
|
| {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Root"));
|
| + CPDF_Reference* pRef = m_pTrailer ? (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Root")) : NULL;
|
| if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
|
| return 0;
|
| }
|
| @@ -1133,7 +1134,7 @@ FX_DWORD CPDF_Parser::GetRootObjNum()
|
| }
|
| FX_DWORD CPDF_Parser::GetInfoObjNum()
|
| {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Info"));
|
| + CPDF_Reference* pRef = m_pTrailer ? (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Info")) : NULL;
|
| if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
|
| return 0;
|
| }
|
| @@ -1491,7 +1492,7 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset
|
| if (!m_pLinearized) {
|
| return FALSE;
|
| }
|
| - if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
|
| + if (m_pLinearized->GetDict() && m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
|
| m_Syntax.GetNextWord(bIsNumber);
|
| CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
|
| if (!pLen) {
|
| @@ -2150,7 +2151,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO
|
| FX_BOOL bIsNumber;
|
| CFX_ByteString key = GetNextWord(bIsNumber);
|
| if (key.IsEmpty()) {
|
| - pDict->Release();
|
| + if (pDict)
|
| + pDict->Release();
|
| return NULL;
|
| }
|
| FX_FILESIZE SavedPos = m_Pos - key.GetLength();
|
| @@ -2206,7 +2208,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO
|
| if (pStream) {
|
| return pStream;
|
| }
|
| - pDict->Release();
|
| + if (pDict)
|
| + pDict->Release();
|
| return NULL;
|
| } else {
|
| m_Pos = SavedPos;
|
| @@ -2307,7 +2310,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList
|
| if (m_WordBuffer[0] == ']') {
|
| return pArray;
|
| }
|
| - pArray->Release();
|
| + if (pArray)
|
| + pArray->Release();
|
| return NULL;
|
| }
|
| pArray->Add(pObj);
|
| @@ -2332,7 +2336,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList
|
| FX_FILESIZE SavedPos = m_Pos;
|
| CFX_ByteString key = GetNextWord(bIsNumber);
|
| if (key.IsEmpty()) {
|
| - pDict->Release();
|
| + if (pDict)
|
| + pDict->Release();
|
| return NULL;
|
| }
|
| if (key == FX_BSTRC(">>")) {
|
| @@ -2348,7 +2353,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList
|
| key = PDF_NameDecode(key);
|
| CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
|
| if (pObj == NULL) {
|
| - pDict->Release();
|
| + if (pDict)
|
| + pDict->Release();
|
| FX_BYTE ch;
|
| while (1) {
|
| if (!GetNextChar(ch)) {
|
| @@ -2380,7 +2386,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList
|
| if (pStream) {
|
| return pStream;
|
| }
|
| - pDict->Release();
|
| + if (pDict)
|
| + pDict->Release();
|
| return NULL;
|
| } else {
|
| m_Pos = SavedPos;
|
| @@ -2835,7 +2842,7 @@ FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePa
|
| pObj = pObj->GetDict();
|
| case PDFOBJ_DICTIONARY: {
|
| CPDF_Dictionary *pDict = pObj->GetDict();
|
| - if (pDict->GetString("Type") == "Page" && !bParsePage) {
|
| + if (pDict && pDict->GetString("Type") == "Page" && !bParsePage) {
|
| continue;
|
| }
|
| FX_POSITION pos = pDict->GetStartPos();
|
| @@ -3157,7 +3164,7 @@ FX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints)
|
| FX_BOOL CPDF_DataAvail::PreparePageItem()
|
| {
|
| CPDF_Dictionary *pRoot = m_pDocument->GetRoot();
|
| - CPDF_Reference* pRef = (CPDF_Reference*)pRoot->GetElement(FX_BSTRC("Pages"));
|
| + CPDF_Reference* pRef = pRoot ? (CPDF_Reference*)pRoot->GetElement(FX_BSTRC("Pages")) : NULL;
|
| if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
|
| m_docStatus = PDF_DATAAVAIL_ERROR;
|
| return FALSE;
|
| @@ -3270,7 +3277,8 @@ FX_BOOL CPDF_DataAvail::GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages)
|
| m_docStatus = PDF_DATAAVAIL_ERROR;
|
| return FALSE;
|
| }
|
| - CPDF_Object *pKids = pPages->GetDict()->GetElement(FX_BSTRC("Kids"));
|
| + CPDF_Dictionary* pDict = pPages->GetDict();
|
| + CPDF_Object *pKids = pDict ? pDict->GetElement(FX_BSTRC("Kids")) : NULL;
|
| if (!pKids) {
|
| return TRUE;
|
| }
|
| @@ -3344,17 +3352,18 @@ FX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints)
|
| FX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints *pHints)
|
| {
|
| FX_DWORD dwFirstPageEndOffset = 0;
|
| - CPDF_Object *pEndOffSet = m_pLinearized->GetDict()->GetElement(FX_BSTRC("E"));
|
| + CPDF_Dictionary* pDict = m_pLinearized->GetDict();
|
| + CPDF_Object *pEndOffSet = pDict ? pDict->GetElement(FX_BSTRC("E")) : NULL;
|
| if (!pEndOffSet) {
|
| m_docStatus = PDF_DATAAVAIL_ERROR;
|
| return FALSE;
|
| }
|
| - CPDF_Object *pXRefOffset = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));
|
| + CPDF_Object *pXRefOffset = pDict ? pDict->GetElement(FX_BSTRC("T")) : NULL;
|
| if (!pXRefOffset) {
|
| m_docStatus = PDF_DATAAVAIL_ERROR;
|
| return FALSE;
|
| }
|
| - CPDF_Object *pFileLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
|
| + CPDF_Object *pFileLen = pDict ? pDict->GetElement(FX_BSTRC("L")) : NULL;
|
| if (!pFileLen) {
|
| m_docStatus = PDF_DATAAVAIL_ERROR;
|
| return FALSE;
|
| @@ -3473,7 +3482,7 @@ FX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen)
|
| if (!m_pLinearized) {
|
| return FALSE;
|
| }
|
| - if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
|
| + if (m_pLinearized->GetDict() && m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
|
| CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
|
| if (!pLen) {
|
| return FALSE;
|
| @@ -3548,7 +3557,8 @@ FX_DWORD CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILES
|
| m_Pos += m_parser.m_Syntax.SavePos();
|
| return 0;
|
| }
|
| - CPDF_Object *pName = pObj->GetDict()->GetElement(FX_BSTRC("Type"));
|
| + CPDF_Dictionary* pDict = pObj->GetDict();
|
| + CPDF_Object *pName = pDict ? pDict->GetElement(FX_BSTRC("Type")) : NULL;
|
| if (pName && pName->GetType() == PDFOBJ_NAME) {
|
| if (pName->GetString() == FX_BSTRC("XRef")) {
|
| m_Pos += m_parser.m_Syntax.SavePos();
|
| @@ -3908,10 +3918,11 @@ FX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pP
|
| return FALSE;
|
| }
|
| pPageNode->m_dwPageNo = dwPageNo;
|
| - CFX_ByteString type = pPage->GetDict()->GetString(FX_BSTRC("Type"));
|
| + CPDF_Dictionary* pDict = pPage->GetDict();
|
| + CFX_ByteString type = pDict ? pDict->GetString(FX_BSTRC("Type")) : CFX_ByteString();
|
| if (type == FX_BSTRC("Pages")) {
|
| pPageNode->m_type = PDF_PAGENODE_PAGES;
|
| - CPDF_Object *pKids = pPage->GetDict()->GetElement(FX_BSTRC("Kids"));
|
| + CPDF_Object *pKids = pDict->GetElement(FX_BSTRC("Kids"));
|
| if (!pKids) {
|
| m_docStatus = PDF_DATAAVAIL_PAGE;
|
| return TRUE;
|
|
|