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

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

Issue 1384123002: Merge to XFA: Get rid of gotos in CPDF_SyntaxParser and FlateUncompress(). (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 2 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') | core/src/fxcodec/codec/fx_codec_flate.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 <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
11 #include "../../../../third_party/base/nonstd_unique_ptr.h"
11 #include "../../../include/fpdfapi/fpdf_module.h" 12 #include "../../../include/fpdfapi/fpdf_module.h"
12 #include "../../../include/fpdfapi/fpdf_page.h" 13 #include "../../../include/fpdfapi/fpdf_page.h"
13 #include "../../../include/fpdfapi/fpdf_parser.h" 14 #include "../../../include/fpdfapi/fpdf_parser.h"
14 #include "../../../include/fxcrt/fx_safe_types.h" 15 #include "../../../include/fxcrt/fx_safe_types.h"
15 #include "../fpdf_page/pageint.h" 16 #include "../fpdf_page/pageint.h"
16 17
18 namespace {
19
20 int CompareFileSize(const void* p1, const void* p2) {
21 return *(FX_FILESIZE*)p1 - *(FX_FILESIZE*)p2;
22 }
23
24 int32_t GetHeaderOffset(IFX_FileRead* pFile) {
25 const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);
26 const size_t kBufSize = 4;
27 uint8_t buf[kBufSize];
28 int32_t offset = 0;
29 while (offset <= 1024) {
30 if (!pFile->ReadBlock(buf, offset, kBufSize))
31 return -1;
32
33 if (*(FX_DWORD*)buf == tag)
34 return offset;
35
36 ++offset;
37 }
38 return -1;
39 }
40
41 int32_t GetDirectInteger(CPDF_Dictionary* pDict, const CFX_ByteStringC& key) {
42 CPDF_Object* pObj = pDict->GetElement(key);
43 if (pObj && (pObj->GetType() == PDFOBJ_NUMBER))
44 return ((CPDF_Number*)pObj)->GetInteger();
45 return 0;
46 }
47
48 bool CheckDirectType(CPDF_Dictionary* pDict,
49 const CFX_ByteStringC& key,
50 int32_t iType) {
51 CPDF_Object* pObj = pDict->GetElement(key);
52 return !pObj || pObj->GetType() == iType;
53 }
54
55 FX_DWORD GetVarInt(const uint8_t* p, int32_t n) {
56 FX_DWORD result = 0;
57 for (int32_t i = 0; i < n; ++i)
58 result = result * 256 + p[i];
59 return result;
60 }
61
62 } // namespace
63
17 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) { 64 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) {
18 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); 65 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type"));
19 if (!pType) { 66 if (!pType) {
20 pType = pDict->GetElementValue(FX_BSTRC("FT")); 67 pType = pDict->GetElementValue(FX_BSTRC("FT"));
21 if (!pType) { 68 if (!pType) {
22 return FALSE; 69 return FALSE;
23 } 70 }
24 } 71 }
25 if (pType->GetString() == FX_BSTRC("Sig")) { 72 if (pType->GetString() == FX_BSTRC("Sig")) {
26 return TRUE; 73 return TRUE;
27 } 74 }
28 return FALSE; 75 return FALSE;
29 } 76 }
30 static int32_t _CompareDWord(const void* p1, const void* p2) {
Lei Zhang 2015/10/02 20:30:22 Slight merge conflict due to this dead function.
31 return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
32 }
33 static int _CompareFileSize(const void* p1, const void* p2) {
34 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);
35 if (ret > 0) {
36 return 1;
37 }
38 if (ret < 0) {
39 return -1;
40 }
41 return 0;
42 }
43 77
44 CPDF_Parser::CPDF_Parser() { 78 CPDF_Parser::CPDF_Parser() {
45 m_pDocument = NULL; 79 m_pDocument = NULL;
46 m_pTrailer = NULL; 80 m_pTrailer = NULL;
47 m_pEncryptDict = NULL; 81 m_pEncryptDict = NULL;
48 m_pSecurityHandler = NULL; 82 m_pSecurityHandler = NULL;
49 m_pLinearized = NULL; 83 m_pLinearized = NULL;
50 m_dwFirstPageNo = 0; 84 m_dwFirstPageNo = 0;
51 m_dwXrefStartObjNum = 0; 85 m_dwXrefStartObjNum = 0;
52 m_bOwnFileRead = TRUE; 86 m_bOwnFileRead = TRUE;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 for (int32_t i = 0; i < iLen; ++i) { 129 for (int32_t i = 0; i < iLen; ++i) {
96 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) 130 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i))
97 trailer->Release(); 131 trailer->Release();
98 } 132 }
99 m_Trailers.RemoveAll(); 133 m_Trailers.RemoveAll();
100 if (m_pLinearized) { 134 if (m_pLinearized) {
101 m_pLinearized->Release(); 135 m_pLinearized->Release();
102 m_pLinearized = NULL; 136 m_pLinearized = NULL;
103 } 137 }
104 } 138 }
105 static int32_t GetHeaderOffset(IFX_FileRead* pFile) {
106 FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);
107 uint8_t buf[4];
108 int32_t offset = 0;
109 while (1) {
110 if (!pFile->ReadBlock(buf, offset, 4)) {
111 return -1;
112 }
113 if (*(FX_DWORD*)buf == tag) {
114 return offset;
115 }
116 offset++;
117 if (offset > 1024) {
118 return -1;
119 }
120 }
121 return -1;
122 }
123 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); 139 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler();
124 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); 140 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*);
125 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, 141 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess,
126 FX_BOOL bReParse, 142 FX_BOOL bReParse,
127 FX_BOOL bOwnFileRead) { 143 FX_BOOL bOwnFileRead) {
128 CloseParser(bReParse); 144 CloseParser(bReParse);
129 m_bXRefStream = FALSE; 145 m_bXRefStream = FALSE;
130 m_LastXRefOffset = 0; 146 m_LastXRefOffset = 0;
131 m_bOwnFileRead = bOwnFileRead; 147 m_bOwnFileRead = bOwnFileRead;
132 int32_t offset = GetHeaderOffset(pFileAccess); 148 int32_t offset = GetHeaderOffset(pFileAccess);
(...skipping 22 matching lines...) Expand all
155 } 171 }
156 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); 172 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);
157 if (!bReParse) { 173 if (!bReParse) {
158 m_pDocument = new CPDF_Document(this); 174 m_pDocument = new CPDF_Document(this);
159 } 175 }
160 FX_BOOL bXRefRebuilt = FALSE; 176 FX_BOOL bXRefRebuilt = FALSE;
161 if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) { 177 if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) {
162 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); 178 FX_FILESIZE startxref_offset = m_Syntax.SavePos();
163 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), 179 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(),
164 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), 180 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
165 _CompareFileSize); 181 CompareFileSize);
166 if (pResult == NULL) { 182 if (pResult == NULL) {
167 m_SortedOffset.Add(startxref_offset); 183 m_SortedOffset.Add(startxref_offset);
168 } 184 }
169 m_Syntax.GetKeyword(); 185 m_Syntax.GetKeyword();
170 FX_BOOL bNumber; 186 FX_BOOL bNumber;
171 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); 187 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);
172 if (!bNumber) { 188 if (!bNumber) {
173 return PDFPARSE_ERROR_FORMAT; 189 return PDFPARSE_ERROR_FORMAT;
174 } 190 }
175 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 191 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
(...skipping 27 matching lines...) Expand all
203 dwRet = SetEncryptHandler(); 219 dwRet = SetEncryptHandler();
204 if (dwRet != PDFPARSE_ERROR_SUCCESS) { 220 if (dwRet != PDFPARSE_ERROR_SUCCESS) {
205 return dwRet; 221 return dwRet;
206 } 222 }
207 m_pDocument->LoadDoc(); 223 m_pDocument->LoadDoc();
208 if (m_pDocument->GetRoot() == NULL) { 224 if (m_pDocument->GetRoot() == NULL) {
209 return PDFPARSE_ERROR_FORMAT; 225 return PDFPARSE_ERROR_FORMAT;
210 } 226 }
211 } 227 }
212 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 228 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
213 sizeof(FX_FILESIZE), _CompareFileSize); 229 sizeof(FX_FILESIZE), CompareFileSize);
214 FX_DWORD RootObjNum = GetRootObjNum(); 230 FX_DWORD RootObjNum = GetRootObjNum();
215 if (RootObjNum == 0) { 231 if (RootObjNum == 0) {
216 ReleaseEncryptHandler(); 232 ReleaseEncryptHandler();
217 RebuildCrossRef(); 233 RebuildCrossRef();
218 RootObjNum = GetRootObjNum(); 234 RootObjNum = GetRootObjNum();
219 if (RootObjNum == 0) { 235 if (RootObjNum == 0) {
220 return PDFPARSE_ERROR_FORMAT; 236 return PDFPARSE_ERROR_FORMAT;
221 } 237 }
222 dwRet = SetEncryptHandler(); 238 dwRet = SetEncryptHandler();
223 if (dwRet != PDFPARSE_ERROR_SUCCESS) { 239 if (dwRet != PDFPARSE_ERROR_SUCCESS) {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 return 0; 325 return 0;
310 } 326 }
311 if (m_V5Type[objnum] == 1) { 327 if (m_V5Type[objnum] == 1) {
312 return m_CrossRef[objnum]; 328 return m_CrossRef[objnum];
313 } 329 }
314 if (m_V5Type[objnum] == 2) { 330 if (m_V5Type[objnum] == 2) {
315 return m_CrossRef[(int32_t)m_CrossRef[objnum]]; 331 return m_CrossRef[(int32_t)m_CrossRef[objnum]];
316 } 332 }
317 return 0; 333 return 0;
318 } 334 }
319 static int32_t GetDirectInteger(CPDF_Dictionary* pDict, 335
320 const CFX_ByteStringC& key) {
321 CPDF_Object* pObj = pDict->GetElement(key);
322 if (pObj == NULL) {
323 return 0;
324 }
325 if (pObj->GetType() == PDFOBJ_NUMBER) {
326 return ((CPDF_Number*)pObj)->GetInteger();
327 }
328 return 0;
329 }
330 static FX_BOOL CheckDirectType(CPDF_Dictionary* pDict,
331 const CFX_ByteStringC& key,
332 int32_t iType) {
333 CPDF_Object* pObj = pDict->GetElement(key);
334 if (!pObj) {
335 return TRUE;
336 }
337 return pObj->GetType() == iType;
338 }
339 FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) { 336 FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) {
340 if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) { 337 if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) {
341 return FALSE; 338 return FALSE;
342 } 339 }
343 m_pTrailer = LoadTrailerV4(); 340 m_pTrailer = LoadTrailerV4();
344 if (m_pTrailer == NULL) { 341 if (m_pTrailer == NULL) {
345 return FALSE; 342 return FALSE;
346 } 343 }
347 int32_t xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); 344 int32_t xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
348 if (xrefsize <= 0 || xrefsize > (1 << 20)) { 345 if (xrefsize <= 0 || xrefsize > (1 << 20)) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 return FALSE; 417 return FALSE;
421 } 418 }
422 return TRUE; 419 return TRUE;
423 } 420 }
424 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, 421 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos,
425 FX_DWORD dwObjCount) { 422 FX_DWORD dwObjCount) {
426 FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; 423 FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset;
427 m_Syntax.RestorePos(dwStartPos); 424 m_Syntax.RestorePos(dwStartPos);
428 void* pResult = 425 void* pResult =
429 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 426 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
430 sizeof(FX_FILESIZE), _CompareFileSize); 427 sizeof(FX_FILESIZE), CompareFileSize);
431 if (pResult == NULL) { 428 if (pResult == NULL) {
432 m_SortedOffset.Add(pos); 429 m_SortedOffset.Add(pos);
433 } 430 }
434 FX_DWORD start_objnum = 0; 431 FX_DWORD start_objnum = 0;
435 FX_DWORD count = dwObjCount; 432 FX_DWORD count = dwObjCount;
436 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 433 FX_FILESIZE SavedPos = m_Syntax.SavePos();
437 int32_t recordsize = 20; 434 int32_t recordsize = 20;
438 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); 435 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);
439 pBuf[1024 * recordsize] = '\0'; 436 pBuf[1024 * recordsize] = '\0';
440 int32_t nBlocks = count / 1024 + 1; 437 int32_t nBlocks = count / 1024 + 1;
(...skipping 26 matching lines...) Expand all
467 } 464 }
468 m_CrossRef.SetAtGrow(objnum, offset); 465 m_CrossRef.SetAtGrow(objnum, offset);
469 int32_t version = FXSYS_atoi(pEntry + 11); 466 int32_t version = FXSYS_atoi(pEntry + 11);
470 if (version >= 1) { 467 if (version >= 1) {
471 m_bVersionUpdated = TRUE; 468 m_bVersionUpdated = TRUE;
472 } 469 }
473 m_ObjVersion.SetAtGrow(objnum, version); 470 m_ObjVersion.SetAtGrow(objnum, version);
474 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { 471 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {
475 void* pResult = FXSYS_bsearch( 472 void* pResult = FXSYS_bsearch(
476 &m_CrossRef[objnum], m_SortedOffset.GetData(), 473 &m_CrossRef[objnum], m_SortedOffset.GetData(),
477 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 474 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), CompareFileSize);
478 if (pResult == NULL) { 475 if (pResult == NULL) {
479 m_SortedOffset.Add(m_CrossRef[objnum]); 476 m_SortedOffset.Add(m_CrossRef[objnum]);
480 } 477 }
481 } 478 }
482 m_V5Type.SetAtGrow(objnum, 1); 479 m_V5Type.SetAtGrow(objnum, 1);
483 } 480 }
484 } 481 }
485 } 482 }
486 FX_Free(pBuf); 483 FX_Free(pBuf);
487 m_Syntax.RestorePos(SavedPos + count * recordsize); 484 m_Syntax.RestorePos(SavedPos + count * recordsize);
488 return TRUE; 485 return TRUE;
489 } 486 }
490 FX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, 487
491 FX_FILESIZE streampos, 488 bool CPDF_Parser::FindPosInOffsets(FX_FILESIZE pos) const {
492 FX_BOOL bSkip, 489 return FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
493 FX_BOOL bFirst) { 490 sizeof(FX_FILESIZE), CompareFileSize);
491 }
492
493 bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos,
494 FX_FILESIZE streampos,
495 FX_BOOL bSkip,
496 FX_BOOL bFirst) {
494 m_Syntax.RestorePos(pos); 497 m_Syntax.RestorePos(pos);
495 if (m_Syntax.GetKeyword() != FX_BSTRC("xref")) { 498 if (m_Syntax.GetKeyword() != FX_BSTRC("xref"))
496 return FALSE; 499 return false;
497 } 500
498 void* pResult = 501 if (!FindPosInOffsets(pos))
499 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
500 sizeof(FX_FILESIZE), _CompareFileSize);
501 if (pResult == NULL) {
502 m_SortedOffset.Add(pos); 502 m_SortedOffset.Add(pos);
503 } 503
504 if (streampos) { 504 if (streampos && !FindPosInOffsets(streampos))
505 void* pResult = FXSYS_bsearch(&streampos, m_SortedOffset.GetData(),
506 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
507 _CompareFileSize);
508 if (pResult == NULL) {
509 m_SortedOffset.Add(streampos); 505 m_SortedOffset.Add(streampos);
510 } 506
511 }
512 while (1) { 507 while (1) {
513 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 508 FX_FILESIZE SavedPos = m_Syntax.SavePos();
514 FX_BOOL bIsNumber; 509 FX_BOOL bIsNumber;
515 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 510 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
516 if (word.IsEmpty()) { 511 if (word.IsEmpty())
517 return FALSE; 512 return false;
518 } 513
519 if (!bIsNumber) { 514 if (!bIsNumber) {
520 m_Syntax.RestorePos(SavedPos); 515 m_Syntax.RestorePos(SavedPos);
521 break; 516 break;
522 } 517 }
523 FX_DWORD start_objnum = FXSYS_atoi(word); 518 FX_DWORD start_objnum = FXSYS_atoi(word);
524 if (start_objnum >= (1 << 20)) { 519 if (start_objnum >= (1 << 20))
525 return FALSE; 520 return false;
526 } 521
527 FX_DWORD count = m_Syntax.GetDirectNum(); 522 FX_DWORD count = m_Syntax.GetDirectNum();
528 m_Syntax.ToNextWord(); 523 m_Syntax.ToNextWord();
529 SavedPos = m_Syntax.SavePos(); 524 SavedPos = m_Syntax.SavePos();
530 FX_BOOL bFirstItem = FALSE; 525 FX_BOOL bFirstItem = FALSE;
531 int32_t recordsize = 20; 526 int32_t recordsize = 20;
532 if (bFirst) { 527 if (bFirst)
533 bFirstItem = TRUE; 528 bFirstItem = TRUE;
534 }
535 m_dwXrefStartObjNum = start_objnum; 529 m_dwXrefStartObjNum = start_objnum;
536 if (!bSkip) { 530 if (!bSkip) {
537 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); 531 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);
538 pBuf[1024 * recordsize] = '\0'; 532 pBuf[1024 * recordsize] = '\0';
539 int32_t nBlocks = count / 1024 + 1; 533 int32_t nBlocks = count / 1024 + 1;
540 FX_BOOL bFirstBlock = TRUE; 534 FX_BOOL bFirstBlock = TRUE;
541 for (int32_t block = 0; block < nBlocks; block++) { 535 for (int32_t block = 0; block < nBlocks; block++) {
542 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; 536 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024;
543 m_Syntax.ReadBlock((uint8_t*)pBuf, block_size * recordsize); 537 m_Syntax.ReadBlock((uint8_t*)pBuf, block_size * recordsize);
544 for (int32_t i = 0; i < block_size; i++) { 538 for (int32_t i = 0; i < block_size; i++) {
(...skipping 13 matching lines...) Expand all
558 } 552 }
559 } 553 }
560 m_CrossRef.SetAtGrow(objnum, 0); 554 m_CrossRef.SetAtGrow(objnum, 0);
561 m_V5Type.SetAtGrow(objnum, 0); 555 m_V5Type.SetAtGrow(objnum, 0);
562 } else { 556 } else {
563 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); 557 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
564 if (offset == 0) { 558 if (offset == 0) {
565 for (int32_t c = 0; c < 10; c++) { 559 for (int32_t c = 0; c < 10; c++) {
566 if (pEntry[c] < '0' || pEntry[c] > '9') { 560 if (pEntry[c] < '0' || pEntry[c] > '9') {
567 FX_Free(pBuf); 561 FX_Free(pBuf);
568 return FALSE; 562 return false;
569 } 563 }
570 } 564 }
571 } 565 }
572 m_CrossRef.SetAtGrow(objnum, offset); 566 m_CrossRef.SetAtGrow(objnum, offset);
573 int32_t version = FXSYS_atoi(pEntry + 11); 567 int32_t version = FXSYS_atoi(pEntry + 11);
574 if (version >= 1) { 568 if (version >= 1) {
575 m_bVersionUpdated = TRUE; 569 m_bVersionUpdated = TRUE;
576 } 570 }
577 m_ObjVersion.SetAtGrow(objnum, version); 571 m_ObjVersion.SetAtGrow(objnum, version);
578 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { 572 if (m_CrossRef[objnum] < m_Syntax.m_FileLen &&
579 void* pResult = 573 !FindPosInOffsets(m_CrossRef[objnum])) {
580 FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), 574 m_SortedOffset.Add(m_CrossRef[objnum]);
581 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
582 _CompareFileSize);
583 if (pResult == NULL) {
584 m_SortedOffset.Add(m_CrossRef[objnum]);
585 }
586 } 575 }
587 m_V5Type.SetAtGrow(objnum, 1); 576 m_V5Type.SetAtGrow(objnum, 1);
588 } 577 }
589 if (bFirstBlock) { 578 if (bFirstBlock) {
590 bFirstBlock = FALSE; 579 bFirstBlock = FALSE;
591 } 580 }
592 } 581 }
593 } 582 }
594 FX_Free(pBuf); 583 FX_Free(pBuf);
595 } 584 }
596 m_Syntax.RestorePos(SavedPos + count * recordsize); 585 m_Syntax.RestorePos(SavedPos + count * recordsize);
597 } 586 }
598 if (streampos) 587 return !streampos || LoadCrossRefV5(streampos, streampos, FALSE);
599 if (!LoadCrossRefV5(streampos, streampos, FALSE)) {
600 return FALSE;
601 }
602 return TRUE;
603 } 588 }
589
604 FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) { 590 FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) {
605 if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) { 591 if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) {
606 return FALSE; 592 return FALSE;
607 } 593 }
608 while (xrefpos) 594 while (xrefpos)
609 if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) { 595 if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
610 return FALSE; 596 return FALSE;
611 } 597 }
612 m_ObjectStreamMap.InitHashTable(101, FALSE); 598 m_ObjectStreamMap.InitHashTable(101, FALSE);
613 m_bXRefStream = TRUE; 599 m_bXRefStream = TRUE;
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 if (PDF_CharType[byte] == 'W' || PDF_CharType[byte] == 'D') { 754 if (PDF_CharType[byte] == 'W' || PDF_CharType[byte] == 'D') {
769 if (objnum > 0x1000000) { 755 if (objnum > 0x1000000) {
770 status = 0; 756 status = 0;
771 break; 757 break;
772 } 758 }
773 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; 759 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;
774 last_obj = start_pos; 760 last_obj = start_pos;
775 void* pResult = 761 void* pResult =
776 FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), 762 FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(),
777 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), 763 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
778 _CompareFileSize); 764 CompareFileSize);
779 if (pResult == NULL) { 765 if (pResult == NULL) {
780 m_SortedOffset.Add(obj_pos); 766 m_SortedOffset.Add(obj_pos);
781 } 767 }
782 FX_FILESIZE obj_end = 0; 768 FX_FILESIZE obj_end = 0;
783 CPDF_Object* pObject = ParseIndirectObjectAtByStrict( 769 CPDF_Object* pObject = ParseIndirectObjectAtByStrict(
784 m_pDocument, obj_pos, objnum, NULL, &obj_end); 770 m_pDocument, obj_pos, objnum, NULL, &obj_end);
785 if (pObject) { 771 if (pObject) {
786 int iType = pObject->GetType(); 772 int iType = pObject->GetType();
787 if (iType == PDFOBJ_STREAM) { 773 if (iType == PDFOBJ_STREAM) {
788 CPDF_Stream* pStream = (CPDF_Stream*)pObject; 774 CPDF_Stream* pStream = (CPDF_Stream*)pObject;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 pos += size; 972 pos += size;
987 } 973 }
988 if (last_xref != -1 && last_xref > last_obj) { 974 if (last_xref != -1 && last_xref > last_obj) {
989 last_trailer = last_xref; 975 last_trailer = last_xref;
990 } else if (last_trailer == -1 || last_xref < last_obj) { 976 } else if (last_trailer == -1 || last_xref < last_obj) {
991 last_trailer = m_Syntax.m_FileLen; 977 last_trailer = m_Syntax.m_FileLen;
992 } 978 }
993 FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset; 979 FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset;
994 void* pResult = 980 void* pResult =
995 FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 981 FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
996 sizeof(FX_FILESIZE), _CompareFileSize); 982 sizeof(FX_FILESIZE), CompareFileSize);
997 if (pResult == NULL) { 983 if (pResult == NULL) {
998 m_SortedOffset.Add(offset); 984 m_SortedOffset.Add(offset);
999 } 985 }
1000 FX_Free(buffer); 986 FX_Free(buffer);
1001 return TRUE; 987 return TRUE;
1002 } 988 }
1003 static FX_DWORD _GetVarInt(const uint8_t* p, int32_t n) { 989
1004 FX_DWORD result = 0;
1005 for (int32_t i = 0; i < n; i++) {
1006 result = result * 256 + p[i];
1007 }
1008 return result;
1009 }
1010 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, 990 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos,
1011 FX_FILESIZE& prev, 991 FX_FILESIZE& prev,
1012 FX_BOOL bMainXRef) { 992 FX_BOOL bMainXRef) {
1013 CPDF_Stream* pStream = 993 CPDF_Stream* pStream =
1014 (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL); 994 (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL);
1015 if (!pStream) { 995 if (!pStream) {
1016 return FALSE; 996 return FALSE;
1017 } 997 }
1018 if (m_pDocument) { 998 if (m_pDocument) {
1019 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); 999 CPDF_Dictionary* pDict = m_pDocument->GetRoot();
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1106 dwMaxObjNum += count; 1086 dwMaxObjNum += count;
1107 FX_DWORD dwV5Size = 1087 FX_DWORD dwV5Size =
1108 pdfium::base::checked_cast<FX_DWORD, int32_t>(m_V5Type.GetSize()); 1088 pdfium::base::checked_cast<FX_DWORD, int32_t>(m_V5Type.GetSize());
1109 if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) { 1089 if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) {
1110 continue; 1090 continue;
1111 } 1091 }
1112 for (FX_DWORD j = 0; j < count; j++) { 1092 for (FX_DWORD j = 0; j < count; j++) {
1113 int32_t type = 1; 1093 int32_t type = 1;
1114 const uint8_t* entrystart = segstart + j * totalWidth; 1094 const uint8_t* entrystart = segstart + j * totalWidth;
1115 if (WidthArray[0]) { 1095 if (WidthArray[0]) {
1116 type = _GetVarInt(entrystart, WidthArray[0]); 1096 type = GetVarInt(entrystart, WidthArray[0]);
1117 } 1097 }
1118 if (m_V5Type[startnum + j] == 255) { 1098 if (m_V5Type[startnum + j] == 255) {
1119 FX_FILESIZE offset = 1099 FX_FILESIZE offset =
1120 _GetVarInt(entrystart + WidthArray[0], WidthArray[1]); 1100 GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
1121 m_CrossRef[startnum + j] = offset; 1101 m_CrossRef[startnum + j] = offset;
1122 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), 1102 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(),
1123 m_SortedOffset.GetSize(), 1103 m_SortedOffset.GetSize(),
1124 sizeof(FX_FILESIZE), _CompareFileSize); 1104 sizeof(FX_FILESIZE), CompareFileSize);
1125 if (pResult == NULL) { 1105 if (pResult == NULL) {
1126 m_SortedOffset.Add(offset); 1106 m_SortedOffset.Add(offset);
1127 } 1107 }
1128 continue; 1108 continue;
1129 } 1109 }
1130 if (m_V5Type[startnum + j]) { 1110 if (m_V5Type[startnum + j]) {
1131 continue; 1111 continue;
1132 } 1112 }
1133 m_V5Type[startnum + j] = type; 1113 m_V5Type[startnum + j] = type;
1134 if (type == 0) { 1114 if (type == 0) {
1135 m_CrossRef[startnum + j] = 0; 1115 m_CrossRef[startnum + j] = 0;
1136 } else { 1116 } else {
1137 FX_FILESIZE offset = 1117 FX_FILESIZE offset =
1138 _GetVarInt(entrystart + WidthArray[0], WidthArray[1]); 1118 GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
1139 m_CrossRef[startnum + j] = offset; 1119 m_CrossRef[startnum + j] = offset;
1140 if (type == 1) { 1120 if (type == 1) {
1141 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), 1121 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(),
1142 m_SortedOffset.GetSize(), 1122 m_SortedOffset.GetSize(),
1143 sizeof(FX_FILESIZE), _CompareFileSize); 1123 sizeof(FX_FILESIZE), CompareFileSize);
1144 if (pResult == NULL) { 1124 if (pResult == NULL) {
1145 m_SortedOffset.Add(offset); 1125 m_SortedOffset.Add(offset);
1146 } 1126 }
1147 } else { 1127 } else {
1148 if (offset < 0 || offset >= m_V5Type.GetSize()) { 1128 if (offset < 0 || offset >= m_V5Type.GetSize()) {
1149 pStream->Release(); 1129 pStream->Release();
1150 return FALSE; 1130 return FALSE;
1151 } 1131 }
1152 m_V5Type[offset] = 255; 1132 m_V5Type[offset] = 255;
1153 } 1133 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 } 1175 }
1196 if (m_V5Type[objnum] == 0) { 1176 if (m_V5Type[objnum] == 0) {
1197 return TRUE; 1177 return TRUE;
1198 } 1178 }
1199 if (m_V5Type[objnum] == 2) { 1179 if (m_V5Type[objnum] == 2) {
1200 return TRUE; 1180 return TRUE;
1201 } 1181 }
1202 FX_FILESIZE pos = m_CrossRef[objnum]; 1182 FX_FILESIZE pos = m_CrossRef[objnum];
1203 void* pResult = 1183 void* pResult =
1204 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 1184 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
1205 sizeof(FX_FILESIZE), _CompareFileSize); 1185 sizeof(FX_FILESIZE), CompareFileSize);
1206 if (pResult == NULL) { 1186 if (pResult == NULL) {
1207 return TRUE; 1187 return TRUE;
1208 } 1188 }
1209 if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == 1189 if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() ==
1210 m_SortedOffset.GetSize() - 1) { 1190 m_SortedOffset.GetSize() - 1) {
1211 return FALSE; 1191 return FALSE;
1212 } 1192 }
1213 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos; 1193 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;
1214 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1194 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1215 m_Syntax.RestorePos(pos); 1195 m_Syntax.RestorePos(pos);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 if (m_V5Type[objnum] == 2) { 1258 if (m_V5Type[objnum] == 2) {
1279 objnum = (FX_DWORD)m_CrossRef[objnum]; 1259 objnum = (FX_DWORD)m_CrossRef[objnum];
1280 } 1260 }
1281 if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) { 1261 if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
1282 FX_FILESIZE offset = m_CrossRef[objnum]; 1262 FX_FILESIZE offset = m_CrossRef[objnum];
1283 if (offset == 0) { 1263 if (offset == 0) {
1284 return 0; 1264 return 0;
1285 } 1265 }
1286 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), 1266 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(),
1287 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), 1267 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
1288 _CompareFileSize); 1268 CompareFileSize);
1289 if (pResult == NULL) { 1269 if (pResult == NULL) {
1290 return 0; 1270 return 0;
1291 } 1271 }
1292 if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == 1272 if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() ==
1293 m_SortedOffset.GetSize() - 1) { 1273 m_SortedOffset.GetSize() - 1) {
1294 return 0; 1274 return 0;
1295 } 1275 }
1296 return ((FX_FILESIZE*)pResult)[1] - offset; 1276 return ((FX_FILESIZE*)pResult)[1] - offset;
1297 } 1277 }
1298 return 0; 1278 return 0;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1359 if (!bIsNumber) { 1339 if (!bIsNumber) {
1360 m_Syntax.RestorePos(SavedPos); 1340 m_Syntax.RestorePos(SavedPos);
1361 return; 1341 return;
1362 } 1342 }
1363 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1343 if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1364 m_Syntax.RestorePos(SavedPos); 1344 m_Syntax.RestorePos(SavedPos);
1365 return; 1345 return;
1366 } 1346 }
1367 void* pResult = 1347 void* pResult =
1368 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 1348 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
1369 sizeof(FX_FILESIZE), _CompareFileSize); 1349 sizeof(FX_FILESIZE), CompareFileSize);
1370 if (pResult == NULL) { 1350 if (pResult == NULL) {
1371 m_Syntax.RestorePos(SavedPos); 1351 m_Syntax.RestorePos(SavedPos);
1372 return; 1352 return;
1373 } 1353 }
1374 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1]; 1354 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];
1375 FX_BOOL bNextOffValid = FALSE; 1355 FX_BOOL bNextOffValid = FALSE;
1376 if (nextoff != pos) { 1356 if (nextoff != pos) {
1377 m_Syntax.RestorePos(nextoff); 1357 m_Syntax.RestorePos(nextoff);
1378 word = m_Syntax.GetNextWord(bIsNumber); 1358 word = m_Syntax.GetNextWord(bIsNumber);
1379 if (word == FX_BSTRC("xref")) { 1359 if (word == FX_BSTRC("xref")) {
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 dwRet = SetEncryptHandler(); 1618 dwRet = SetEncryptHandler();
1639 if (dwRet != PDFPARSE_ERROR_SUCCESS) { 1619 if (dwRet != PDFPARSE_ERROR_SUCCESS) {
1640 return dwRet; 1620 return dwRet;
1641 } 1621 }
1642 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); 1622 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());
1643 if (m_pDocument->GetRoot() == NULL) { 1623 if (m_pDocument->GetRoot() == NULL) {
1644 return PDFPARSE_ERROR_FORMAT; 1624 return PDFPARSE_ERROR_FORMAT;
1645 } 1625 }
1646 } 1626 }
1647 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 1627 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
1648 sizeof(FX_FILESIZE), _CompareFileSize); 1628 sizeof(FX_FILESIZE), CompareFileSize);
1649 FX_DWORD RootObjNum = GetRootObjNum(); 1629 FX_DWORD RootObjNum = GetRootObjNum();
1650 if (RootObjNum == 0) { 1630 if (RootObjNum == 0) {
1651 ReleaseEncryptHandler(); 1631 ReleaseEncryptHandler();
1652 RebuildCrossRef(); 1632 RebuildCrossRef();
1653 RootObjNum = GetRootObjNum(); 1633 RootObjNum = GetRootObjNum();
1654 if (RootObjNum == 0) { 1634 if (RootObjNum == 0) {
1655 return PDFPARSE_ERROR_FORMAT; 1635 return PDFPARSE_ERROR_FORMAT;
1656 } 1636 }
1657 dwRet = SetEncryptHandler(); 1637 dwRet = SetEncryptHandler();
1658 if (dwRet != PDFPARSE_ERROR_SUCCESS) { 1638 if (dwRet != PDFPARSE_ERROR_SUCCESS) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 delete pStream; 1690 delete pStream;
1711 } 1691 }
1712 m_ObjectStreamMap.RemoveAll(); 1692 m_ObjectStreamMap.RemoveAll();
1713 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && 1693 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) &&
1714 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { 1694 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
1715 m_LastXRefOffset = 0; 1695 m_LastXRefOffset = 0;
1716 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1696 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1717 return PDFPARSE_ERROR_FORMAT; 1697 return PDFPARSE_ERROR_FORMAT;
1718 } 1698 }
1719 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 1699 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
1720 sizeof(FX_FILESIZE), _CompareFileSize); 1700 sizeof(FX_FILESIZE), CompareFileSize);
1721 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1701 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1722 return PDFPARSE_ERROR_SUCCESS; 1702 return PDFPARSE_ERROR_SUCCESS;
1723 } 1703 }
1724 1704
1725 // static 1705 // static
1726 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; 1706 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0;
1727 1707
1728 CPDF_SyntaxParser::CPDF_SyntaxParser() { 1708 CPDF_SyntaxParser::CPDF_SyntaxParser() {
1729 m_pFileAccess = NULL; 1709 m_pFileAccess = NULL;
1730 m_pCryptoHandler = NULL; 1710 m_pCryptoHandler = NULL;
1731 m_pFileBuf = NULL; 1711 m_pFileBuf = NULL;
1732 m_BufSize = CPDF_ModuleMgr::kFileBufSize; 1712 m_BufSize = CPDF_ModuleMgr::kFileBufSize;
1733 m_pFileBuf = NULL; 1713 m_pFileBuf = NULL;
1734 m_MetadataObjnum = 0; 1714 m_MetadataObjnum = 0;
1735 m_dwWordPos = 0; 1715 m_dwWordPos = 0;
1736 m_bFileStream = FALSE; 1716 m_bFileStream = FALSE;
1737 } 1717 }
1738 CPDF_SyntaxParser::~CPDF_SyntaxParser() { 1718 CPDF_SyntaxParser::~CPDF_SyntaxParser() {
1739 FX_Free(m_pFileBuf); 1719 FX_Free(m_pFileBuf);
1740 } 1720 }
1721
1741 FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) { 1722 FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) {
1742 FX_FILESIZE save_pos = m_Pos; 1723 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos);
1743 m_Pos = pos; 1724 m_Pos = pos;
1744 FX_BOOL ret = GetNextChar(ch); 1725 return GetNextChar(ch);
1745 m_Pos = save_pos;
1746 return ret;
1747 } 1726 }
1727
1748 FX_BOOL CPDF_SyntaxParser::GetNextChar(uint8_t& ch) { 1728 FX_BOOL CPDF_SyntaxParser::GetNextChar(uint8_t& ch) {
1749 FX_FILESIZE pos = m_Pos + m_HeaderOffset; 1729 FX_FILESIZE pos = m_Pos + m_HeaderOffset;
1750 if (pos >= m_FileLen) { 1730 if (pos >= m_FileLen) {
1751 return FALSE; 1731 return FALSE;
1752 } 1732 }
1753 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { 1733 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
1754 FX_FILESIZE read_pos = pos; 1734 FX_FILESIZE read_pos = pos;
1755 FX_DWORD read_size = m_BufSize; 1735 FX_DWORD read_size = m_BufSize;
1756 if ((FX_FILESIZE)read_size > m_FileLen) { 1736 if ((FX_FILESIZE)read_size > m_FileLen) {
1757 read_size = (FX_DWORD)m_FileLen; 1737 read_size = (FX_DWORD)m_FileLen;
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after
2692 } else { 2672 } else {
2693 offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1; 2673 offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1;
2694 pos--; 2674 pos--;
2695 } 2675 }
2696 if (pos < 0) { 2676 if (pos < 0) {
2697 return FALSE; 2677 return FALSE;
2698 } 2678 }
2699 } 2679 }
2700 return FALSE; 2680 return FALSE;
2701 } 2681 }
2682
2702 struct _SearchTagRecord { 2683 struct _SearchTagRecord {
2703 const uint8_t* m_pTag; 2684 const uint8_t* m_pTag;
2704 FX_DWORD m_Len; 2685 FX_DWORD m_Len;
2705 FX_DWORD m_Offset; 2686 FX_DWORD m_Offset;
2706 }; 2687 };
2688
2707 int32_t CPDF_SyntaxParser::SearchMultiWord(const CFX_ByteStringC& tags, 2689 int32_t CPDF_SyntaxParser::SearchMultiWord(const CFX_ByteStringC& tags,
2708 FX_BOOL bWholeWord, 2690 FX_BOOL bWholeWord,
2709 FX_FILESIZE limit) { 2691 FX_FILESIZE limit) {
2710 int32_t ntags = 1, i; 2692 int32_t ntags = 1;
2711 for (i = 0; i < tags.GetLength(); i++) 2693 for (int i = 0; i < tags.GetLength(); ++i) {
2712 if (tags[i] == 0) { 2694 if (tags[i] == 0) {
2713 ntags++; 2695 ++ntags;
2714 } 2696 }
2715 _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags); 2697 }
2716 FX_DWORD start = 0, itag = 0, max_len = 0; 2698
2717 for (i = 0; i <= tags.GetLength(); i++) { 2699 std::vector<_SearchTagRecord> patterns(ntags);
2700 FX_DWORD start = 0;
2701 FX_DWORD itag = 0;
2702 FX_DWORD max_len = 0;
2703 for (int i = 0; i <= tags.GetLength(); ++i) {
2718 if (tags[i] == 0) { 2704 if (tags[i] == 0) {
2719 FX_DWORD len = i - start; 2705 FX_DWORD len = i - start;
2720 if (len > max_len) { 2706 max_len = std::max(len, max_len);
2721 max_len = len; 2707 patterns[itag].m_pTag = tags.GetPtr() + start;
2722 } 2708 patterns[itag].m_Len = len;
2723 pPatterns[itag].m_pTag = tags.GetPtr() + start; 2709 patterns[itag].m_Offset = 0;
2724 pPatterns[itag].m_Len = len;
2725 pPatterns[itag].m_Offset = 0;
2726 start = i + 1; 2710 start = i + 1;
2727 itag++; 2711 ++itag;
2728 } 2712 }
2729 } 2713 }
2730 FX_FILESIZE pos = m_Pos; 2714
2731 uint8_t byte; 2715 const FX_FILESIZE pos_limit = m_Pos + limit;
2732 GetCharAt(pos++, byte); 2716 for (FX_FILESIZE pos = m_Pos; !limit || pos < pos_limit; ++pos) {
2733 int32_t found = -1; 2717 uint8_t byte;
2734 while (1) { 2718 if (!GetCharAt(pos, byte))
2735 for (i = 0; i < ntags; i++) { 2719 break;
2736 if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) { 2720
2737 pPatterns[i].m_Offset++; 2721 for (int i = 0; i < ntags; ++i) {
2738 if (pPatterns[i].m_Offset == pPatterns[i].m_Len) { 2722 _SearchTagRecord& pat = patterns[i];
2739 if (!bWholeWord || 2723 if (pat.m_pTag[pat.m_Offset] != byte) {
2740 IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, 2724 pat.m_Offset = (pat.m_pTag[0] == byte) ? 1 : 0;
2741 pPatterns[i].m_Len, FALSE)) { 2725 continue;
2742 found = i;
2743 goto end;
2744 } else {
2745 if (pPatterns[i].m_pTag[0] == byte) {
2746 pPatterns[i].m_Offset = 1;
2747 } else {
2748 pPatterns[i].m_Offset = 0;
2749 }
2750 }
2751 }
2752 } else {
2753 if (pPatterns[i].m_pTag[0] == byte) {
2754 pPatterns[i].m_Offset = 1;
2755 } else {
2756 pPatterns[i].m_Offset = 0;
2757 }
2758 } 2726 }
2727
2728 ++pat.m_Offset;
2729 if (pat.m_Offset != pat.m_Len)
2730 continue;
2731
2732 if (!bWholeWord ||
2733 IsWholeWord(pos - pat.m_Len, limit, pat.m_pTag, pat.m_Len, FALSE)) {
2734 return i;
2735 }
2736
2737 pat.m_Offset = (pat.m_pTag[0] == byte) ? 1 : 0;
2759 } 2738 }
2760 if (limit && pos >= m_Pos + limit) {
2761 goto end;
2762 }
2763 if (!GetCharAt(pos, byte)) {
2764 goto end;
2765 }
2766 pos++;
2767 } 2739 }
2768 end: 2740 return -1;
2769 FX_Free(pPatterns);
2770 return found;
2771 } 2741 }
2742
2772 FX_FILESIZE CPDF_SyntaxParser::FindTag(const CFX_ByteStringC& tag, 2743 FX_FILESIZE CPDF_SyntaxParser::FindTag(const CFX_ByteStringC& tag,
2773 FX_FILESIZE limit) { 2744 FX_FILESIZE limit) {
2774 int32_t taglen = tag.GetLength(); 2745 int32_t taglen = tag.GetLength();
2775 int32_t match = 0; 2746 int32_t match = 0;
2776 limit += m_Pos; 2747 limit += m_Pos;
2777 FX_FILESIZE startpos = m_Pos; 2748 FX_FILESIZE startpos = m_Pos;
2778 while (1) { 2749 while (1) {
2779 uint8_t ch; 2750 uint8_t ch;
2780 if (!GetNextChar(ch)) { 2751 if (!GetNextChar(ch)) {
2781 return -1; 2752 return -1;
(...skipping 24 matching lines...) Expand all
2806 break; 2777 break;
2807 } 2778 }
2808 } 2779 }
2809 } 2780 }
2810 2781
2811 class CPDF_DataAvail final : public IPDF_DataAvail { 2782 class CPDF_DataAvail final : public IPDF_DataAvail {
2812 public: 2783 public:
2813 CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead); 2784 CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
2814 ~CPDF_DataAvail() override; 2785 ~CPDF_DataAvail() override;
2815 2786
2816 virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) override; 2787 FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) override;
2817 2788
2818 virtual void SetDocument(CPDF_Document* pDoc) override; 2789 void SetDocument(CPDF_Document* pDoc) override;
2819 2790
2820 virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) override; 2791 FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) override;
2821 2792
2822 virtual int32_t IsFormAvail(IFX_DownloadHints* pHints) override; 2793 int32_t IsFormAvail(IFX_DownloadHints* pHints) override;
2823 2794
2824 virtual int32_t IsLinearizedPDF() override; 2795 int32_t IsLinearizedPDF() override;
2825 2796
2826 virtual FX_BOOL IsLinearized() override { return m_bLinearized; } 2797 FX_BOOL IsLinearized() override { return m_bLinearized; }
2827 2798
2828 virtual void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, 2799 void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, FX_DWORD* pSize) override;
2829 FX_DWORD* pSize) override;
2830 2800
2831 protected: 2801 protected:
2832 static const int kMaxDataAvailRecursionDepth = 64; 2802 static const int kMaxDataAvailRecursionDepth = 64;
2833 static int s_CurrentDataAvailRecursionDepth; 2803 static int s_CurrentDataAvailRecursionDepth;
2834 2804
2835 FX_DWORD GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset); 2805 FX_DWORD GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);
2836 FX_BOOL IsObjectsAvail(CFX_PtrArray& obj_array, 2806 FX_BOOL IsObjectsAvail(CFX_PtrArray& obj_array,
2837 FX_BOOL bParsePage, 2807 FX_BOOL bParsePage,
2838 IFX_DownloadHints* pHints, 2808 IFX_DownloadHints* pHints,
2839 CFX_PtrArray& ret_array); 2809 CFX_PtrArray& ret_array);
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
3099 if (pParser->m_V5Type[objnum] == 2) { 3069 if (pParser->m_V5Type[objnum] == 2) {
3100 objnum = (FX_DWORD)pParser->m_CrossRef[objnum]; 3070 objnum = (FX_DWORD)pParser->m_CrossRef[objnum];
3101 } 3071 }
3102 if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) { 3072 if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) {
3103 offset = pParser->m_CrossRef[objnum]; 3073 offset = pParser->m_CrossRef[objnum];
3104 if (offset == 0) { 3074 if (offset == 0) {
3105 return 0; 3075 return 0;
3106 } 3076 }
3107 void* pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), 3077 void* pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(),
3108 pParser->m_SortedOffset.GetSize(), 3078 pParser->m_SortedOffset.GetSize(),
3109 sizeof(FX_FILESIZE), _CompareFileSize); 3079 sizeof(FX_FILESIZE), CompareFileSize);
3110 if (pResult == NULL) { 3080 if (pResult == NULL) {
3111 return 0; 3081 return 0;
3112 } 3082 }
3113 if ((FX_FILESIZE*)pResult - 3083 if ((FX_FILESIZE*)pResult -
3114 (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == 3084 (FX_FILESIZE*)pParser->m_SortedOffset.GetData() ==
3115 pParser->m_SortedOffset.GetSize() - 1) { 3085 pParser->m_SortedOffset.GetSize() - 1) {
3116 return 0; 3086 return 0;
3117 } 3087 }
3118 return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset); 3088 return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset);
3119 } 3089 }
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
3351 FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) { 3321 FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) {
3352 m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset); 3322 m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset);
3353 m_parser.m_bOwnFileRead = FALSE; 3323 m_parser.m_bOwnFileRead = FALSE;
3354 if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && 3324 if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) &&
3355 !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) { 3325 !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) {
3356 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3326 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3357 return FALSE; 3327 return FALSE;
3358 } 3328 }
3359 FXSYS_qsort(m_parser.m_SortedOffset.GetData(), 3329 FXSYS_qsort(m_parser.m_SortedOffset.GetData(),
3360 m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), 3330 m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
3361 _CompareFileSize); 3331 CompareFileSize);
3362 m_dwRootObjNum = m_parser.GetRootObjNum(); 3332 m_dwRootObjNum = m_parser.GetRootObjNum();
3363 m_dwInfoObjNum = m_parser.GetInfoObjNum(); 3333 m_dwInfoObjNum = m_parser.GetInfoObjNum();
3364 m_pCurrentParser = &m_parser; 3334 m_pCurrentParser = &m_parser;
3365 m_docStatus = PDF_DATAAVAIL_ROOT; 3335 m_docStatus = PDF_DATAAVAIL_ROOT;
3366 return TRUE; 3336 return TRUE;
3367 } 3337 }
3368 CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, 3338 CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum,
3369 IFX_DownloadHints* pHints, 3339 IFX_DownloadHints* pHints,
3370 FX_BOOL* pExistInFile) { 3340 FX_BOOL* pExistInFile) {
3371 CPDF_Object* pRet = NULL; 3341 CPDF_Object* pRet = NULL;
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after
4682 return FALSE; 4652 return FALSE;
4683 } 4653 }
4684 CPDF_PageNode::~CPDF_PageNode() { 4654 CPDF_PageNode::~CPDF_PageNode() {
4685 int32_t iSize = m_childNode.GetSize(); 4655 int32_t iSize = m_childNode.GetSize();
4686 for (int32_t i = 0; i < iSize; ++i) { 4656 for (int32_t i = 0; i < iSize; ++i) {
4687 CPDF_PageNode* pNode = (CPDF_PageNode*)m_childNode[i]; 4657 CPDF_PageNode* pNode = (CPDF_PageNode*)m_childNode[i];
4688 delete pNode; 4658 delete pNode;
4689 } 4659 }
4690 m_childNode.RemoveAll(); 4660 m_childNode.RemoveAll();
4691 } 4661 }
OLDNEW
« no previous file with comments | « core/include/fxcrt/fx_basic.h ('k') | core/src/fxcodec/codec/fx_codec_flate.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698