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

Side by Side Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

Issue 875263002: Fix infinite recursion in CPDF_Parser::ParseIndirectObjectAt(). (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: explicit constructor. Created 5 years, 11 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 unified diff | Download patch
« no previous file with comments | « core/include/fxcrt/fx_basic.h ('k') | fpdfsdk/src/fpdfview_embeddertest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "../../../include/fpdfapi/fpdf_parser.h" 7 #include "../../../include/fpdfapi/fpdf_parser.h"
8 #include "../../../include/fpdfapi/fpdf_module.h" 8 #include "../../../include/fpdfapi/fpdf_module.h"
9 #include "../../../include/fpdfapi/fpdf_page.h" 9 #include "../../../include/fpdfapi/fpdf_page.h"
10 #include "../../../../third_party/numerics/safe_math.h" 10 #include "../../../../third_party/numerics/safe_math.h"
11 #include "../fpdf_page/pageint.h" 11 #include "../fpdf_page/pageint.h"
12 #include <utility> 12 #include <utility>
13 #include <vector> 13 #include <vector>
14 14
15 #define _PARSER_OBJECT_LEVLE_ 64
16 extern const FX_LPCSTR _PDF_CharType; 15 extern const FX_LPCSTR _PDF_CharType;
17 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) 16 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict)
18 { 17 {
19 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); 18 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type"));
20 if (!pType) { 19 if (!pType) {
21 pType = pDict->GetElementValue(FX_BSTRC("FT")); 20 pType = pDict->GetElementValue(FX_BSTRC("FT"));
22 if (!pType) { 21 if (!pType) {
23 return FALSE; 22 return FALSE;
24 } 23 }
25 } 24 }
26 if (pType->GetString() == FX_BSTRC("Sig")) { 25 if (pType->GetString() == FX_BSTRC("Sig")) {
27 return TRUE; 26 return TRUE;
28 } 27 }
29 return FALSE; 28 return FALSE;
30 } 29 }
31 static int _CompareFileSize(const void* p1, const void* p2) 30 static int _CompareFileSize(const void* p1, const void* p2)
32 { 31 {
33 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2); 32 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);
34 if (ret > 0) { 33 if (ret > 0) {
35 return 1; 34 return 1;
36 } 35 }
37 if (ret < 0) { 36 if (ret < 0) {
38 return -1; 37 return -1;
39 } 38 }
40 return 0; 39 return 0;
41 } 40 }
41
42 CPDF_Parser::CPDF_Parser() 42 CPDF_Parser::CPDF_Parser()
43 { 43 {
44 m_pDocument = NULL; 44 m_pDocument = NULL;
45 m_pTrailer = NULL; 45 m_pTrailer = NULL;
46 m_pEncryptDict = NULL; 46 m_pEncryptDict = NULL;
47 m_pSecurityHandler = NULL; 47 m_pSecurityHandler = NULL;
48 m_pLinearized = NULL; 48 m_pLinearized = NULL;
49 m_dwFirstPageNo = 0; 49 m_dwFirstPageNo = 0;
50 m_dwXrefStartObjNum = 0; 50 m_dwXrefStartObjNum = 0;
51 m_bOwnFileRead = TRUE; 51 m_bOwnFileRead = TRUE;
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); 1210 FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));
1211 CPDF_SyntaxParser syntax; 1211 CPDF_SyntaxParser syntax;
1212 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p ObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE)); 1212 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p ObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));
1213 syntax.InitParser((IFX_FileStream*)file, 0); 1213 syntax.InitParser((IFX_FileStream*)file, 0);
1214 CPDF_Object* pRet = NULL; 1214 CPDF_Object* pRet = NULL;
1215 while (n) { 1215 while (n) {
1216 FX_DWORD thisnum = syntax.GetDirectNum(); 1216 FX_DWORD thisnum = syntax.GetDirectNum();
1217 FX_DWORD thisoff = syntax.GetDirectNum(); 1217 FX_DWORD thisoff = syntax.GetDirectNum();
1218 if (thisnum == objnum) { 1218 if (thisnum == objnum) {
1219 syntax.RestorePos(offset + thisoff); 1219 syntax.RestorePos(offset + thisoff);
1220 pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext); 1220 pRet = syntax.GetObject(pObjList, 0, 0, pContext);
1221 break; 1221 break;
1222 } 1222 }
1223 n --; 1223 n --;
1224 } 1224 }
1225 return pRet; 1225 return pRet;
1226 } 1226 }
1227 return NULL; 1227 return NULL;
1228 } 1228 }
1229 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) 1229 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum)
1230 { 1230 {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1389 word = m_Syntax.GetNextWord(bIsNumber); 1389 word = m_Syntax.GetNextWord(bIsNumber);
1390 if (!bIsNumber) { 1390 if (!bIsNumber) {
1391 m_Syntax.RestorePos(SavedPos); 1391 m_Syntax.RestorePos(SavedPos);
1392 return NULL; 1392 return NULL;
1393 } 1393 }
1394 FX_DWORD parser_gennum = FXSYS_atoi(word); 1394 FX_DWORD parser_gennum = FXSYS_atoi(word);
1395 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1395 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1396 m_Syntax.RestorePos(SavedPos); 1396 m_Syntax.RestorePos(SavedPos);
1397 return NULL; 1397 return NULL;
1398 } 1398 }
1399 CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, 0, p Context); 1399 CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, pCon text);
1400 FX_FILESIZE endOffset = m_Syntax.SavePos(); 1400 FX_FILESIZE endOffset = m_Syntax.SavePos();
1401 CFX_ByteString bsWord = m_Syntax.GetKeyword(); 1401 CFX_ByteString bsWord = m_Syntax.GetKeyword();
1402 if (bsWord == FX_BSTRC("endobj")) { 1402 if (bsWord == FX_BSTRC("endobj")) {
1403 endOffset = m_Syntax.SavePos(); 1403 endOffset = m_Syntax.SavePos();
1404 } 1404 }
1405 m_Syntax.RestorePos(SavedPos); 1405 m_Syntax.RestorePos(SavedPos);
1406 if (pObj) { 1406 if (pObj) {
1407 if (!objnum) { 1407 if (!objnum) {
1408 pObj->m_ObjNum = parser_objnum; 1408 pObj->m_ObjNum = parser_objnum;
1409 } 1409 }
(...skipping 20 matching lines...) Expand all
1430 word = m_Syntax.GetNextWord(bIsNumber); 1430 word = m_Syntax.GetNextWord(bIsNumber);
1431 if (!bIsNumber) { 1431 if (!bIsNumber) {
1432 m_Syntax.RestorePos(SavedPos); 1432 m_Syntax.RestorePos(SavedPos);
1433 return NULL; 1433 return NULL;
1434 } 1434 }
1435 FX_DWORD gennum = FXSYS_atoi(word); 1435 FX_DWORD gennum = FXSYS_atoi(word);
1436 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1436 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1437 m_Syntax.RestorePos(SavedPos); 1437 m_Syntax.RestorePos(SavedPos);
1438 return NULL; 1438 return NULL;
1439 } 1439 }
1440 CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext); 1440 CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, pCo ntext);
1441 if (pResultPos) { 1441 if (pResultPos) {
1442 *pResultPos = m_Syntax.m_Pos; 1442 *pResultPos = m_Syntax.m_Pos;
1443 } 1443 }
1444 m_Syntax.RestorePos(SavedPos); 1444 m_Syntax.RestorePos(SavedPos);
1445 return pObj; 1445 return pObj;
1446 } 1446 }
1447 CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() 1447 CPDF_Dictionary* CPDF_Parser::LoadTrailerV4()
1448 { 1448 {
1449 if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) { 1449 if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) {
1450 return NULL; 1450 return NULL;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1669 m_ObjectStreamMap.RemoveAll(); 1669 m_ObjectStreamMap.RemoveAll();
1670 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && ! LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { 1670 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && ! LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
1671 m_LastXRefOffset = 0; 1671 m_LastXRefOffset = 0;
1672 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1672 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1673 return PDFPARSE_ERROR_FORMAT; 1673 return PDFPARSE_ERROR_FORMAT;
1674 } 1674 }
1675 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FI LESIZE), _CompareFileSize); 1675 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FI LESIZE), _CompareFileSize);
1676 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1676 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1677 return PDFPARSE_ERROR_SUCCESS; 1677 return PDFPARSE_ERROR_SUCCESS;
1678 } 1678 }
1679
1680 // static
1681 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0;
1682
1679 CPDF_SyntaxParser::CPDF_SyntaxParser() 1683 CPDF_SyntaxParser::CPDF_SyntaxParser()
1680 { 1684 {
1681 m_pFileAccess = NULL; 1685 m_pFileAccess = NULL;
1682 m_pCryptoHandler = NULL; 1686 m_pCryptoHandler = NULL;
1683 m_pFileBuf = NULL; 1687 m_pFileBuf = NULL;
1684 m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize; 1688 m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize;
1685 m_pFileBuf = NULL; 1689 m_pFileBuf = NULL;
1686 m_MetadataObjnum = 0; 1690 m_MetadataObjnum = 0;
1687 m_dwWordPos = 0; 1691 m_dwWordPos = 0;
1688 m_bFileStream = FALSE; 1692 m_bFileStream = FALSE;
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
2042 { 2046 {
2043 GetNextWord(); 2047 GetNextWord();
2044 bIsNumber = m_bIsNumber; 2048 bIsNumber = m_bIsNumber;
2045 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); 2049 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
2046 } 2050 }
2047 CFX_ByteString CPDF_SyntaxParser::GetKeyword() 2051 CFX_ByteString CPDF_SyntaxParser::GetKeyword()
2048 { 2052 {
2049 GetNextWord(); 2053 GetNextWord();
2050 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); 2054 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
2051 } 2055 }
2052 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO RD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDe crypt) 2056 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO RD objnum, FX_DWORD gennum, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)
2053 { 2057 {
2054 if (level > _PARSER_OBJECT_LEVLE_) { 2058 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2059 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2055 return NULL; 2060 return NULL;
2056 } 2061 }
2057 FX_FILESIZE SavedPos = m_Pos; 2062 FX_FILESIZE SavedPos = m_Pos;
2058 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2063 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2059 FX_BOOL bIsNumber; 2064 FX_BOOL bIsNumber;
2060 CFX_ByteString word = GetNextWord(bIsNumber); 2065 CFX_ByteString word = GetNextWord(bIsNumber);
2061 CPDF_Object* pRet = NULL; 2066 CPDF_Object* pRet = NULL;
2062 if (word.GetLength() == 0) { 2067 if (word.GetLength() == 0) {
2063 if (bTypeOnly) { 2068 if (bTypeOnly) {
2064 return (CPDF_Object*)PDFOBJ_INVALID; 2069 return (CPDF_Object*)PDFOBJ_INVALID;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 } 2134 }
2130 pRet = CPDF_String::Create(str, TRUE); 2135 pRet = CPDF_String::Create(str, TRUE);
2131 return pRet; 2136 return pRet;
2132 } 2137 }
2133 if (word == FX_BSTRC("[")) { 2138 if (word == FX_BSTRC("[")) {
2134 if (bTypeOnly) { 2139 if (bTypeOnly) {
2135 return (CPDF_Object*)PDFOBJ_ARRAY; 2140 return (CPDF_Object*)PDFOBJ_ARRAY;
2136 } 2141 }
2137 CPDF_Array* pArray = CPDF_Array::Create(); 2142 CPDF_Array* pArray = CPDF_Array::Create();
2138 while (1) { 2143 while (1) {
2139 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2144 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2140 if (pObj == NULL) { 2145 if (pObj == NULL) {
2141 return pArray; 2146 return pArray;
2142 } 2147 }
2143 pArray->Add(pObj); 2148 pArray->Add(pObj);
2144 } 2149 }
2145 } 2150 }
2146 if (word[0] == '/') { 2151 if (word[0] == '/') {
2147 if (bTypeOnly) { 2152 if (bTypeOnly) {
2148 return (CPDF_Object*)PDFOBJ_NAME; 2153 return (CPDF_Object*)PDFOBJ_NAME;
2149 } 2154 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2181 break; 2186 break;
2182 } 2187 }
2183 if (key[0] != '/') { 2188 if (key[0] != '/') {
2184 continue; 2189 continue;
2185 } 2190 }
2186 nKeys ++; 2191 nKeys ++;
2187 key = PDF_NameDecode(key); 2192 key = PDF_NameDecode(key);
2188 if (key == FX_BSTRC("/Contents")) { 2193 if (key == FX_BSTRC("/Contents")) {
2189 dwSignValuePos = m_Pos; 2194 dwSignValuePos = m_Pos;
2190 } 2195 }
2191 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2196 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2192 if (pObj == NULL) { 2197 if (pObj == NULL) {
2193 continue; 2198 continue;
2194 } 2199 }
2195 if (key.GetLength() >= 1) { 2200 if (key.GetLength() >= 1) {
2196 if (nKeys < 32) { 2201 if (nKeys < 32) {
2197 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength( ) - 1), pObj); 2202 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength( ) - 1), pObj);
2198 } else { 2203 } else {
2199 pDict->AddValue(CFX_ByteStringC(key.c_str() + 1, key.GetLeng th() - 1), pObj); 2204 pDict->AddValue(CFX_ByteStringC(key.c_str() + 1, key.GetLeng th() - 1), pObj);
2200 } 2205 }
2201 } 2206 }
2202 } 2207 }
2203 if (IsSignatureDict(pDict)) { 2208 if (IsSignatureDict(pDict)) {
2204 FX_FILESIZE dwSavePos = m_Pos; 2209 FX_FILESIZE dwSavePos = m_Pos;
2205 m_Pos = dwSignValuePos; 2210 m_Pos = dwSignValuePos;
2206 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, N ULL, FALSE); 2211 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, NULL, FALSE) ;
2207 pDict->SetAt(FX_BSTRC("Contents"), pObj); 2212 pDict->SetAt(FX_BSTRC("Contents"), pObj);
2208 m_Pos = dwSavePos; 2213 m_Pos = dwSavePos;
2209 } 2214 }
2210 if (pContext) { 2215 if (pContext) {
2211 pContext->m_DictEnd = m_Pos; 2216 pContext->m_DictEnd = m_Pos;
2212 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2217 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2213 return pDict; 2218 return pDict;
2214 } 2219 }
2215 } 2220 }
2216 FX_FILESIZE SavedPos = m_Pos; 2221 FX_FILESIZE SavedPos = m_Pos;
(...skipping 14 matching lines...) Expand all
2231 } 2236 }
2232 if (word == FX_BSTRC(">>")) { 2237 if (word == FX_BSTRC(">>")) {
2233 m_Pos = SavedPos; 2238 m_Pos = SavedPos;
2234 return NULL; 2239 return NULL;
2235 } 2240 }
2236 if (bTypeOnly) { 2241 if (bTypeOnly) {
2237 return (CPDF_Object*)PDFOBJ_INVALID; 2242 return (CPDF_Object*)PDFOBJ_INVALID;
2238 } 2243 }
2239 return NULL; 2244 return NULL;
2240 } 2245 }
2241 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList , FX_DWORD objnum, FX_DWORD gennum, 2246 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList , FX_DWORD objnum, FX_DWORD gennum, struct PARSE_CONTEXT* pContext)
2242 FX_INT32 level, struct PARSE_CONTEXT* pContext)
2243 { 2247 {
2244 if (level > _PARSER_OBJECT_LEVLE_) { 2248 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2249 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2245 return NULL; 2250 return NULL;
2246 } 2251 }
2247 FX_FILESIZE SavedPos = m_Pos; 2252 FX_FILESIZE SavedPos = m_Pos;
2248 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2253 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2249 FX_BOOL bIsNumber; 2254 FX_BOOL bIsNumber;
2250 CFX_ByteString word = GetNextWord(bIsNumber); 2255 CFX_ByteString word = GetNextWord(bIsNumber);
2251 if (word.GetLength() == 0) { 2256 if (word.GetLength() == 0) {
2252 if (bTypeOnly) { 2257 if (bTypeOnly) {
2253 return (CPDF_Object*)PDFOBJ_INVALID; 2258 return (CPDF_Object*)PDFOBJ_INVALID;
2254 } 2259 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2311 m_pCryptoHandler->Decrypt(objnum, gennum, str); 2316 m_pCryptoHandler->Decrypt(objnum, gennum, str);
2312 } 2317 }
2313 return CPDF_String::Create(str, TRUE); 2318 return CPDF_String::Create(str, TRUE);
2314 } 2319 }
2315 if (word == FX_BSTRC("[")) { 2320 if (word == FX_BSTRC("[")) {
2316 if (bTypeOnly) { 2321 if (bTypeOnly) {
2317 return (CPDF_Object*)PDFOBJ_ARRAY; 2322 return (CPDF_Object*)PDFOBJ_ARRAY;
2318 } 2323 }
2319 CPDF_Array* pArray = CPDF_Array::Create(); 2324 CPDF_Array* pArray = CPDF_Array::Create();
2320 while (1) { 2325 while (1) {
2321 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2326 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2322 if (pObj == NULL) { 2327 if (pObj == NULL) {
2323 if (m_WordBuffer[0] == ']') { 2328 if (m_WordBuffer[0] == ']') {
2324 return pArray; 2329 return pArray;
2325 } 2330 }
2326 if (pArray) 2331 if (pArray)
2327 pArray->Release(); 2332 pArray->Release();
2328 return NULL; 2333 return NULL;
2329 } 2334 }
2330 pArray->Add(pObj); 2335 pArray->Add(pObj);
2331 } 2336 }
(...skipping 25 matching lines...) Expand all
2357 break; 2362 break;
2358 } 2363 }
2359 if (key == FX_BSTRC("endobj")) { 2364 if (key == FX_BSTRC("endobj")) {
2360 m_Pos = SavedPos; 2365 m_Pos = SavedPos;
2361 break; 2366 break;
2362 } 2367 }
2363 if (key[0] != '/') { 2368 if (key[0] != '/') {
2364 continue; 2369 continue;
2365 } 2370 }
2366 key = PDF_NameDecode(key); 2371 key = PDF_NameDecode(key);
2367 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2372 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2368 if (pObj == NULL) { 2373 if (pObj == NULL) {
2369 if (pDict) 2374 if (pDict)
2370 pDict->Release(); 2375 pDict->Release();
2371 FX_BYTE ch; 2376 FX_BYTE ch;
2372 while (1) { 2377 while (1) {
2373 if (!GetNextChar(ch)) { 2378 if (!GetNextChar(ch)) {
2374 break; 2379 break;
2375 } 2380 }
2376 if (ch == 0x0A || ch == 0x0D) { 2381 if (ch == 0x0A || ch == 0x0D) {
2377 break; 2382 break;
(...skipping 2246 matching lines...) Expand 10 before | Expand all | Expand 10 after
4624 { 4629 {
4625 FX_INT32 iSize = m_childNode.GetSize(); 4630 FX_INT32 iSize = m_childNode.GetSize();
4626 for (FX_INT32 i = 0; i < iSize; ++i) { 4631 for (FX_INT32 i = 0; i < iSize; ++i) {
4627 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; 4632 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i];
4628 if (pNode) { 4633 if (pNode) {
4629 delete pNode; 4634 delete pNode;
4630 } 4635 }
4631 } 4636 }
4632 m_childNode.RemoveAll(); 4637 m_childNode.RemoveAll();
4633 } 4638 }
OLDNEW
« no previous file with comments | « core/include/fxcrt/fx_basic.h ('k') | fpdfsdk/src/fpdfview_embeddertest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698