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

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

Issue 880753002: Merge to XFA: Fix infinite recursion in CPDF_Parser::ParseIndirectObjectAt(). (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 10 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 }
(...skipping 10 matching lines...) Expand all
36 { 35 {
37 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2); 36 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);
38 if (ret > 0) { 37 if (ret > 0) {
39 return 1; 38 return 1;
40 } 39 }
41 if (ret < 0) { 40 if (ret < 0) {
42 return -1; 41 return -1;
43 } 42 }
44 return 0; 43 return 0;
45 } 44 }
45
46 CPDF_Parser::CPDF_Parser() 46 CPDF_Parser::CPDF_Parser()
47 { 47 {
48 m_pDocument = NULL; 48 m_pDocument = NULL;
49 m_pTrailer = NULL; 49 m_pTrailer = NULL;
50 m_pEncryptDict = NULL; 50 m_pEncryptDict = NULL;
51 m_pSecurityHandler = NULL; 51 m_pSecurityHandler = NULL;
52 m_pLinearized = NULL; 52 m_pLinearized = NULL;
53 m_dwFirstPageNo = 0; 53 m_dwFirstPageNo = 0;
54 m_dwXrefStartObjNum = 0; 54 m_dwXrefStartObjNum = 0;
55 m_bOwnFileRead = TRUE; 55 m_bOwnFileRead = TRUE;
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); 1214 FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));
1215 CPDF_SyntaxParser syntax; 1215 CPDF_SyntaxParser syntax;
1216 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p ObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE)); 1216 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p ObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));
1217 syntax.InitParser((IFX_FileStream*)file, 0); 1217 syntax.InitParser((IFX_FileStream*)file, 0);
1218 CPDF_Object* pRet = NULL; 1218 CPDF_Object* pRet = NULL;
1219 while (n) { 1219 while (n) {
1220 FX_DWORD thisnum = syntax.GetDirectNum(); 1220 FX_DWORD thisnum = syntax.GetDirectNum();
1221 FX_DWORD thisoff = syntax.GetDirectNum(); 1221 FX_DWORD thisoff = syntax.GetDirectNum();
1222 if (thisnum == objnum) { 1222 if (thisnum == objnum) {
1223 syntax.RestorePos(offset + thisoff); 1223 syntax.RestorePos(offset + thisoff);
1224 pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext); 1224 pRet = syntax.GetObject(pObjList, 0, 0, pContext);
1225 break; 1225 break;
1226 } 1226 }
1227 n --; 1227 n --;
1228 } 1228 }
1229 return pRet; 1229 return pRet;
1230 } 1230 }
1231 return NULL; 1231 return NULL;
1232 } 1232 }
1233 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) 1233 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum)
1234 { 1234 {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 word = m_Syntax.GetNextWord(bIsNumber); 1393 word = m_Syntax.GetNextWord(bIsNumber);
1394 if (!bIsNumber) { 1394 if (!bIsNumber) {
1395 m_Syntax.RestorePos(SavedPos); 1395 m_Syntax.RestorePos(SavedPos);
1396 return NULL; 1396 return NULL;
1397 } 1397 }
1398 FX_DWORD parser_gennum = FXSYS_atoi(word); 1398 FX_DWORD parser_gennum = FXSYS_atoi(word);
1399 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1399 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1400 m_Syntax.RestorePos(SavedPos); 1400 m_Syntax.RestorePos(SavedPos);
1401 return NULL; 1401 return NULL;
1402 } 1402 }
1403 CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, 0, p Context); 1403 CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, pCon text);
1404 FX_FILESIZE endOffset = m_Syntax.SavePos(); 1404 FX_FILESIZE endOffset = m_Syntax.SavePos();
1405 CFX_ByteString bsWord = m_Syntax.GetKeyword(); 1405 CFX_ByteString bsWord = m_Syntax.GetKeyword();
1406 if (bsWord == FX_BSTRC("endobj")) { 1406 if (bsWord == FX_BSTRC("endobj")) {
1407 endOffset = m_Syntax.SavePos(); 1407 endOffset = m_Syntax.SavePos();
1408 } 1408 }
1409 m_Syntax.RestorePos(SavedPos); 1409 m_Syntax.RestorePos(SavedPos);
1410 if (pObj) { 1410 if (pObj) {
1411 if (!objnum) { 1411 if (!objnum) {
1412 pObj->m_ObjNum = parser_objnum; 1412 pObj->m_ObjNum = parser_objnum;
1413 } 1413 }
(...skipping 20 matching lines...) Expand all
1434 word = m_Syntax.GetNextWord(bIsNumber); 1434 word = m_Syntax.GetNextWord(bIsNumber);
1435 if (!bIsNumber) { 1435 if (!bIsNumber) {
1436 m_Syntax.RestorePos(SavedPos); 1436 m_Syntax.RestorePos(SavedPos);
1437 return NULL; 1437 return NULL;
1438 } 1438 }
1439 FX_DWORD gennum = FXSYS_atoi(word); 1439 FX_DWORD gennum = FXSYS_atoi(word);
1440 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1440 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1441 m_Syntax.RestorePos(SavedPos); 1441 m_Syntax.RestorePos(SavedPos);
1442 return NULL; 1442 return NULL;
1443 } 1443 }
1444 CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext); 1444 CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, pCo ntext);
1445 if (pResultPos) { 1445 if (pResultPos) {
1446 *pResultPos = m_Syntax.m_Pos; 1446 *pResultPos = m_Syntax.m_Pos;
1447 } 1447 }
1448 m_Syntax.RestorePos(SavedPos); 1448 m_Syntax.RestorePos(SavedPos);
1449 return pObj; 1449 return pObj;
1450 } 1450 }
1451 CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() 1451 CPDF_Dictionary* CPDF_Parser::LoadTrailerV4()
1452 { 1452 {
1453 if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) { 1453 if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) {
1454 return NULL; 1454 return NULL;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1673 m_ObjectStreamMap.RemoveAll(); 1673 m_ObjectStreamMap.RemoveAll();
1674 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && ! LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { 1674 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && ! LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
1675 m_LastXRefOffset = 0; 1675 m_LastXRefOffset = 0;
1676 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1676 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1677 return PDFPARSE_ERROR_FORMAT; 1677 return PDFPARSE_ERROR_FORMAT;
1678 } 1678 }
1679 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FI LESIZE), _CompareFileSize); 1679 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FI LESIZE), _CompareFileSize);
1680 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1680 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1681 return PDFPARSE_ERROR_SUCCESS; 1681 return PDFPARSE_ERROR_SUCCESS;
1682 } 1682 }
1683
1684 // static
1685 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0;
1686
1683 CPDF_SyntaxParser::CPDF_SyntaxParser() 1687 CPDF_SyntaxParser::CPDF_SyntaxParser()
1684 { 1688 {
1685 m_pFileAccess = NULL; 1689 m_pFileAccess = NULL;
1686 m_pCryptoHandler = NULL; 1690 m_pCryptoHandler = NULL;
1687 m_pFileBuf = NULL; 1691 m_pFileBuf = NULL;
1688 m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize; 1692 m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize;
1689 m_pFileBuf = NULL; 1693 m_pFileBuf = NULL;
1690 m_MetadataObjnum = 0; 1694 m_MetadataObjnum = 0;
1691 m_dwWordPos = 0; 1695 m_dwWordPos = 0;
1692 m_bFileStream = FALSE; 1696 m_bFileStream = FALSE;
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
2046 { 2050 {
2047 GetNextWord(); 2051 GetNextWord();
2048 bIsNumber = m_bIsNumber; 2052 bIsNumber = m_bIsNumber;
2049 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); 2053 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
2050 } 2054 }
2051 CFX_ByteString CPDF_SyntaxParser::GetKeyword() 2055 CFX_ByteString CPDF_SyntaxParser::GetKeyword()
2052 { 2056 {
2053 GetNextWord(); 2057 GetNextWord();
2054 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); 2058 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
2055 } 2059 }
2056 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) 2060 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO RD objnum, FX_DWORD gennum, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)
2057 { 2061 {
2058 if (level > _PARSER_OBJECT_LEVLE_) { 2062 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2063 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2059 return NULL; 2064 return NULL;
2060 } 2065 }
2061 FX_FILESIZE SavedPos = m_Pos; 2066 FX_FILESIZE SavedPos = m_Pos;
2062 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2067 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2063 FX_BOOL bIsNumber; 2068 FX_BOOL bIsNumber;
2064 CFX_ByteString word = GetNextWord(bIsNumber); 2069 CFX_ByteString word = GetNextWord(bIsNumber);
2065 CPDF_Object* pRet = NULL; 2070 CPDF_Object* pRet = NULL;
2066 if (word.GetLength() == 0) { 2071 if (word.GetLength() == 0) {
2067 if (bTypeOnly) { 2072 if (bTypeOnly) {
2068 return (CPDF_Object*)PDFOBJ_INVALID; 2073 return (CPDF_Object*)PDFOBJ_INVALID;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 } 2138 }
2134 pRet = CPDF_String::Create(str, TRUE); 2139 pRet = CPDF_String::Create(str, TRUE);
2135 return pRet; 2140 return pRet;
2136 } 2141 }
2137 if (word == FX_BSTRC("[")) { 2142 if (word == FX_BSTRC("[")) {
2138 if (bTypeOnly) { 2143 if (bTypeOnly) {
2139 return (CPDF_Object*)PDFOBJ_ARRAY; 2144 return (CPDF_Object*)PDFOBJ_ARRAY;
2140 } 2145 }
2141 CPDF_Array* pArray = CPDF_Array::Create(); 2146 CPDF_Array* pArray = CPDF_Array::Create();
2142 while (1) { 2147 while (1) {
2143 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2148 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2144 if (pObj == NULL) { 2149 if (pObj == NULL) {
2145 return pArray; 2150 return pArray;
2146 } 2151 }
2147 pArray->Add(pObj); 2152 pArray->Add(pObj);
2148 } 2153 }
2149 } 2154 }
2150 if (word[0] == '/') { 2155 if (word[0] == '/') {
2151 if (bTypeOnly) { 2156 if (bTypeOnly) {
2152 return (CPDF_Object*)PDFOBJ_NAME; 2157 return (CPDF_Object*)PDFOBJ_NAME;
2153 } 2158 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2185 break; 2190 break;
2186 } 2191 }
2187 if (key[0] != '/') { 2192 if (key[0] != '/') {
2188 continue; 2193 continue;
2189 } 2194 }
2190 nKeys ++; 2195 nKeys ++;
2191 key = PDF_NameDecode(key); 2196 key = PDF_NameDecode(key);
2192 if (key == FX_BSTRC("/Contents")) { 2197 if (key == FX_BSTRC("/Contents")) {
2193 dwSignValuePos = m_Pos; 2198 dwSignValuePos = m_Pos;
2194 } 2199 }
2195 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2200 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2196 if (pObj == NULL) { 2201 if (pObj == NULL) {
2197 continue; 2202 continue;
2198 } 2203 }
2199 if (key.GetLength() >= 1) { 2204 if (key.GetLength() >= 1) {
2200 if (nKeys < 32) { 2205 if (nKeys < 32) {
2201 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength( ) - 1), pObj); 2206 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength( ) - 1), pObj);
2202 } else { 2207 } else {
2203 pDict->AddValue(CFX_ByteStringC(key.c_str() + 1, key.GetLeng th() - 1), pObj); 2208 pDict->AddValue(CFX_ByteStringC(key.c_str() + 1, key.GetLeng th() - 1), pObj);
2204 } 2209 }
2205 } 2210 }
2206 } 2211 }
2207 if (IsSignatureDict(pDict)) { 2212 if (IsSignatureDict(pDict)) {
2208 FX_FILESIZE dwSavePos = m_Pos; 2213 FX_FILESIZE dwSavePos = m_Pos;
2209 m_Pos = dwSignValuePos; 2214 m_Pos = dwSignValuePos;
2210 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, N ULL, FALSE); 2215 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, NULL, FALSE) ;
2211 pDict->SetAt(FX_BSTRC("Contents"), pObj); 2216 pDict->SetAt(FX_BSTRC("Contents"), pObj);
2212 m_Pos = dwSavePos; 2217 m_Pos = dwSavePos;
2213 } 2218 }
2214 if (pContext) { 2219 if (pContext) {
2215 pContext->m_DictEnd = m_Pos; 2220 pContext->m_DictEnd = m_Pos;
2216 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2221 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2217 return pDict; 2222 return pDict;
2218 } 2223 }
2219 } 2224 }
2220 FX_FILESIZE SavedPos = m_Pos; 2225 FX_FILESIZE SavedPos = m_Pos;
(...skipping 14 matching lines...) Expand all
2235 } 2240 }
2236 if (word == FX_BSTRC(">>")) { 2241 if (word == FX_BSTRC(">>")) {
2237 m_Pos = SavedPos; 2242 m_Pos = SavedPos;
2238 return NULL; 2243 return NULL;
2239 } 2244 }
2240 if (bTypeOnly) { 2245 if (bTypeOnly) {
2241 return (CPDF_Object*)PDFOBJ_INVALID; 2246 return (CPDF_Object*)PDFOBJ_INVALID;
2242 } 2247 }
2243 return NULL; 2248 return NULL;
2244 } 2249 }
2245 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList , FX_DWORD objnum, FX_DWORD gennum, 2250 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList , FX_DWORD objnum, FX_DWORD gennum, struct PARSE_CONTEXT* pContext)
2246 FX_INT32 level, struct PARSE_CONTEXT* pContext)
2247 { 2251 {
2248 if (level > _PARSER_OBJECT_LEVLE_) { 2252 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2253 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2249 return NULL; 2254 return NULL;
2250 } 2255 }
2251 FX_FILESIZE SavedPos = m_Pos; 2256 FX_FILESIZE SavedPos = m_Pos;
2252 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2257 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2253 FX_BOOL bIsNumber; 2258 FX_BOOL bIsNumber;
2254 CFX_ByteString word = GetNextWord(bIsNumber); 2259 CFX_ByteString word = GetNextWord(bIsNumber);
2255 if (word.GetLength() == 0) { 2260 if (word.GetLength() == 0) {
2256 if (bTypeOnly) { 2261 if (bTypeOnly) {
2257 return (CPDF_Object*)PDFOBJ_INVALID; 2262 return (CPDF_Object*)PDFOBJ_INVALID;
2258 } 2263 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 m_pCryptoHandler->Decrypt(objnum, gennum, str); 2320 m_pCryptoHandler->Decrypt(objnum, gennum, str);
2316 } 2321 }
2317 return CPDF_String::Create(str, TRUE); 2322 return CPDF_String::Create(str, TRUE);
2318 } 2323 }
2319 if (word == FX_BSTRC("[")) { 2324 if (word == FX_BSTRC("[")) {
2320 if (bTypeOnly) { 2325 if (bTypeOnly) {
2321 return (CPDF_Object*)PDFOBJ_ARRAY; 2326 return (CPDF_Object*)PDFOBJ_ARRAY;
2322 } 2327 }
2323 CPDF_Array* pArray = CPDF_Array::Create(); 2328 CPDF_Array* pArray = CPDF_Array::Create();
2324 while (1) { 2329 while (1) {
2325 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2330 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2326 if (pObj == NULL) { 2331 if (pObj == NULL) {
2327 if (m_WordBuffer[0] == ']') { 2332 if (m_WordBuffer[0] == ']') {
2328 return pArray; 2333 return pArray;
2329 } 2334 }
2330 if (pArray) 2335 if (pArray)
2331 pArray->Release(); 2336 pArray->Release();
2332 return NULL; 2337 return NULL;
2333 } 2338 }
2334 pArray->Add(pObj); 2339 pArray->Add(pObj);
2335 } 2340 }
(...skipping 25 matching lines...) Expand all
2361 break; 2366 break;
2362 } 2367 }
2363 if (key == FX_BSTRC("endobj")) { 2368 if (key == FX_BSTRC("endobj")) {
2364 m_Pos = SavedPos; 2369 m_Pos = SavedPos;
2365 break; 2370 break;
2366 } 2371 }
2367 if (key[0] != '/') { 2372 if (key[0] != '/') {
2368 continue; 2373 continue;
2369 } 2374 }
2370 key = PDF_NameDecode(key); 2375 key = PDF_NameDecode(key);
2371 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2376 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2372 if (pObj == NULL) { 2377 if (pObj == NULL) {
2373 if (pDict) 2378 if (pDict)
2374 pDict->Release(); 2379 pDict->Release();
2375 FX_BYTE ch; 2380 FX_BYTE ch;
2376 while (1) { 2381 while (1) {
2377 if (!GetNextChar(ch)) { 2382 if (!GetNextChar(ch)) {
2378 break; 2383 break;
2379 } 2384 }
2380 if (ch == 0x0A || ch == 0x0D) { 2385 if (ch == 0x0A || ch == 0x0D) {
2381 break; 2386 break;
(...skipping 2246 matching lines...) Expand 10 before | Expand all | Expand 10 after
4628 { 4633 {
4629 FX_INT32 iSize = m_childNode.GetSize(); 4634 FX_INT32 iSize = m_childNode.GetSize();
4630 for (FX_INT32 i = 0; i < iSize; ++i) { 4635 for (FX_INT32 i = 0; i < iSize; ++i) {
4631 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; 4636 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i];
4632 if (pNode) { 4637 if (pNode) {
4633 delete pNode; 4638 delete pNode;
4634 } 4639 }
4635 } 4640 }
4636 m_childNode.RemoveAll(); 4641 m_childNode.RemoveAll();
4637 } 4642 }
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