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

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

Issue 1755273002: Fix parsing of object numbers > 16,777,216. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 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/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp ('k') | core/src/fxcrt/fx_basic_gcc.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 "core/include/fpdfapi/fpdf_parser.h" 7 #include "core/include/fpdfapi/fpdf_parser.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 bool bIsNumber; 527 bool bIsNumber;
528 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 528 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
529 if (word.IsEmpty()) 529 if (word.IsEmpty())
530 return false; 530 return false;
531 531
532 if (!bIsNumber) { 532 if (!bIsNumber) {
533 m_Syntax.RestorePos(SavedPos); 533 m_Syntax.RestorePos(SavedPos);
534 break; 534 break;
535 } 535 }
536 536
537 FX_DWORD start_objnum = FXSYS_atoi(word); 537 FX_DWORD start_objnum = FXSYS_atoui(word);
538 if (start_objnum >= kMaxObjectNumber) 538 if (start_objnum >= kMaxObjectNumber)
539 return false; 539 return false;
540 540
541 FX_DWORD count = m_Syntax.GetDirectNum(); 541 FX_DWORD count = m_Syntax.GetDirectNum();
542 m_Syntax.ToNextWord(); 542 m_Syntax.ToNextWord();
543 SavedPos = m_Syntax.SavePos(); 543 SavedPos = m_Syntax.SavePos();
544 const int32_t recordsize = 20; 544 const int32_t recordsize = 20;
545 545
546 m_dwXrefStartObjNum = start_objnum; 546 m_dwXrefStartObjNum = start_objnum;
547 if (!bSkip) { 547 if (!bSkip) {
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 case 2: 751 case 2:
752 if (byte != 'j') { 752 if (byte != 'j') {
753 --i; 753 --i;
754 state = ParserState::kDefault; 754 state = ParserState::kDefault;
755 } else { 755 } else {
756 inside_index++; 756 inside_index++;
757 } 757 }
758 break; 758 break;
759 case 3: 759 case 3:
760 if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { 760 if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) {
761 if (objnum > 0x1000000) {
762 state = ParserState::kDefault;
763 break;
764 }
765 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; 761 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;
766 m_SortedOffset.insert(obj_pos); 762 m_SortedOffset.insert(obj_pos);
767 last_obj = start_pos; 763 last_obj = start_pos;
768 FX_FILESIZE obj_end = 0; 764 FX_FILESIZE obj_end = 0;
769 CPDF_Object* pObject = ParseIndirectObjectAtByStrict( 765 CPDF_Object* pObject = ParseIndirectObjectAtByStrict(
770 m_pDocument, obj_pos, objnum, &obj_end); 766 m_pDocument, obj_pos, objnum, &obj_end);
771 if (CPDF_Stream* pStream = ToStream(pObject)) { 767 if (CPDF_Stream* pStream = ToStream(pObject)) {
772 if (CPDF_Dictionary* pDict = pStream->GetDict()) { 768 if (CPDF_Dictionary* pDict = pStream->GetDict()) {
773 if ((pDict->KeyExist("Type")) && 769 if ((pDict->KeyExist("Type")) &&
774 (pDict->GetStringBy("Type") == "XRef" && 770 (pDict->GetStringBy("Type") == "XRef" &&
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1312 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1317 m_Syntax.RestorePos(pos); 1313 m_Syntax.RestorePos(pos);
1318 1314
1319 bool bIsNumber; 1315 bool bIsNumber;
1320 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1316 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1321 if (!bIsNumber) { 1317 if (!bIsNumber) {
1322 m_Syntax.RestorePos(SavedPos); 1318 m_Syntax.RestorePos(SavedPos);
1323 return; 1319 return;
1324 } 1320 }
1325 1321
1326 FX_DWORD parser_objnum = FXSYS_atoi(word); 1322 FX_DWORD parser_objnum = FXSYS_atoui(word);
1327 if (parser_objnum && parser_objnum != objnum) { 1323 if (parser_objnum && parser_objnum != objnum) {
1328 m_Syntax.RestorePos(SavedPos); 1324 m_Syntax.RestorePos(SavedPos);
1329 return; 1325 return;
1330 } 1326 }
1331 1327
1332 word = m_Syntax.GetNextWord(&bIsNumber); 1328 word = m_Syntax.GetNextWord(&bIsNumber);
1333 if (!bIsNumber) { 1329 if (!bIsNumber) {
1334 m_Syntax.RestorePos(SavedPos); 1330 m_Syntax.RestorePos(SavedPos);
1335 return; 1331 return;
1336 } 1332 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1388 m_Syntax.RestorePos(pos); 1384 m_Syntax.RestorePos(pos);
1389 bool bIsNumber; 1385 bool bIsNumber;
1390 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1386 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1391 if (!bIsNumber) { 1387 if (!bIsNumber) {
1392 m_Syntax.RestorePos(SavedPos); 1388 m_Syntax.RestorePos(SavedPos);
1393 return nullptr; 1389 return nullptr;
1394 } 1390 }
1395 1391
1396 FX_FILESIZE objOffset = m_Syntax.SavePos(); 1392 FX_FILESIZE objOffset = m_Syntax.SavePos();
1397 objOffset -= word.GetLength(); 1393 objOffset -= word.GetLength();
1398 FX_DWORD parser_objnum = FXSYS_atoi(word); 1394 FX_DWORD parser_objnum = FXSYS_atoui(word);
1399 if (objnum && parser_objnum != objnum) { 1395 if (objnum && parser_objnum != objnum) {
1400 m_Syntax.RestorePos(SavedPos); 1396 m_Syntax.RestorePos(SavedPos);
1401 return nullptr; 1397 return nullptr;
1402 } 1398 }
1403 1399
1404 word = m_Syntax.GetNextWord(&bIsNumber); 1400 word = m_Syntax.GetNextWord(&bIsNumber);
1405 if (!bIsNumber) { 1401 if (!bIsNumber) {
1406 m_Syntax.RestorePos(SavedPos); 1402 m_Syntax.RestorePos(SavedPos);
1407 return nullptr; 1403 return nullptr;
1408 } 1404 }
1409 1405
1410 FX_DWORD parser_gennum = FXSYS_atoi(word); 1406 FX_DWORD parser_gennum = FXSYS_atoui(word);
1411 if (m_Syntax.GetKeyword() != "obj") { 1407 if (m_Syntax.GetKeyword() != "obj") {
1412 m_Syntax.RestorePos(SavedPos); 1408 m_Syntax.RestorePos(SavedPos);
1413 return nullptr; 1409 return nullptr;
1414 } 1410 }
1415 1411
1416 CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, true); 1412 CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, true);
1417 m_Syntax.SavePos(); 1413 m_Syntax.SavePos();
1418 1414
1419 CFX_ByteString bsWord = m_Syntax.GetKeyword(); 1415 CFX_ByteString bsWord = m_Syntax.GetKeyword();
1420 if (bsWord == "endobj") 1416 if (bsWord == "endobj")
(...skipping 16 matching lines...) Expand all
1437 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1433 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1438 m_Syntax.RestorePos(pos); 1434 m_Syntax.RestorePos(pos);
1439 1435
1440 bool bIsNumber; 1436 bool bIsNumber;
1441 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1437 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1442 if (!bIsNumber) { 1438 if (!bIsNumber) {
1443 m_Syntax.RestorePos(SavedPos); 1439 m_Syntax.RestorePos(SavedPos);
1444 return nullptr; 1440 return nullptr;
1445 } 1441 }
1446 1442
1447 FX_DWORD parser_objnum = FXSYS_atoi(word); 1443 FX_DWORD parser_objnum = FXSYS_atoui(word);
1448 if (objnum && parser_objnum != objnum) { 1444 if (objnum && parser_objnum != objnum) {
1449 m_Syntax.RestorePos(SavedPos); 1445 m_Syntax.RestorePos(SavedPos);
1450 return nullptr; 1446 return nullptr;
1451 } 1447 }
1452 1448
1453 word = m_Syntax.GetNextWord(&bIsNumber); 1449 word = m_Syntax.GetNextWord(&bIsNumber);
1454 if (!bIsNumber) { 1450 if (!bIsNumber) {
1455 m_Syntax.RestorePos(SavedPos); 1451 m_Syntax.RestorePos(SavedPos);
1456 return nullptr; 1452 return nullptr;
1457 } 1453 }
1458 1454
1459 FX_DWORD gennum = FXSYS_atoi(word); 1455 FX_DWORD gennum = FXSYS_atoui(word);
1460 if (m_Syntax.GetKeyword() != "obj") { 1456 if (m_Syntax.GetKeyword() != "obj") {
1461 m_Syntax.RestorePos(SavedPos); 1457 m_Syntax.RestorePos(SavedPos);
1462 return nullptr; 1458 return nullptr;
1463 } 1459 }
1464 1460
1465 CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum); 1461 CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum);
1466 if (pResultPos) 1462 if (pResultPos)
1467 *pResultPos = m_Syntax.m_Pos; 1463 *pResultPos = m_Syntax.m_Pos;
1468 1464
1469 m_Syntax.RestorePos(SavedPos); 1465 m_Syntax.RestorePos(SavedPos);
(...skipping 29 matching lines...) Expand all
1499 FX_DWORD offset) { 1495 FX_DWORD offset) {
1500 m_Syntax.InitParser(pFileAccess, offset); 1496 m_Syntax.InitParser(pFileAccess, offset);
1501 m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9); 1497 m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);
1502 1498
1503 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1499 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1504 bool bIsNumber; 1500 bool bIsNumber;
1505 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1501 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1506 if (!bIsNumber) 1502 if (!bIsNumber)
1507 return FALSE; 1503 return FALSE;
1508 1504
1509 FX_DWORD objnum = FXSYS_atoi(word); 1505 FX_DWORD objnum = FXSYS_atoui(word);
1510 word = m_Syntax.GetNextWord(&bIsNumber); 1506 word = m_Syntax.GetNextWord(&bIsNumber);
1511 if (!bIsNumber) 1507 if (!bIsNumber)
1512 return FALSE; 1508 return FALSE;
1513 1509
1514 FX_DWORD gennum = FXSYS_atoi(word); 1510 FX_DWORD gennum = FXSYS_atoui(word);
1515 if (m_Syntax.GetKeyword() != "obj") { 1511 if (m_Syntax.GetKeyword() != "obj") {
1516 m_Syntax.RestorePos(SavedPos); 1512 m_Syntax.RestorePos(SavedPos);
1517 return FALSE; 1513 return FALSE;
1518 } 1514 }
1519 1515
1520 m_pLinearized = m_Syntax.GetObject(nullptr, objnum, gennum, true); 1516 m_pLinearized = m_Syntax.GetObject(nullptr, objnum, gennum, true);
1521 if (!m_pLinearized) 1517 if (!m_pLinearized)
1522 return FALSE; 1518 return FALSE;
1523 1519
1524 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); 1520 CPDF_Dictionary* pDict = m_pLinearized->GetDict();
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
2032 CFX_ByteString word = GetNextWord(&bIsNumber); 2028 CFX_ByteString word = GetNextWord(&bIsNumber);
2033 if (word.GetLength() == 0) 2029 if (word.GetLength() == 0)
2034 return nullptr; 2030 return nullptr;
2035 2031
2036 if (bIsNumber) { 2032 if (bIsNumber) {
2037 FX_FILESIZE SavedPos = m_Pos; 2033 FX_FILESIZE SavedPos = m_Pos;
2038 CFX_ByteString nextword = GetNextWord(&bIsNumber); 2034 CFX_ByteString nextword = GetNextWord(&bIsNumber);
2039 if (bIsNumber) { 2035 if (bIsNumber) {
2040 CFX_ByteString nextword2 = GetNextWord(nullptr); 2036 CFX_ByteString nextword2 = GetNextWord(nullptr);
2041 if (nextword2 == "R") { 2037 if (nextword2 == "R") {
2042 FX_DWORD objnum = FXSYS_atoi(word); 2038 FX_DWORD objnum = FXSYS_atoui(word);
2043 return new CPDF_Reference(pObjList, objnum); 2039 return new CPDF_Reference(pObjList, objnum);
2044 } 2040 }
2045 } 2041 }
2046 m_Pos = SavedPos; 2042 m_Pos = SavedPos;
2047 return new CPDF_Number(word); 2043 return new CPDF_Number(word);
2048 } 2044 }
2049 2045
2050 if (word == "true" || word == "false") 2046 if (word == "true" || word == "false")
2051 return new CPDF_Boolean(word == "true"); 2047 return new CPDF_Boolean(word == "true");
2052 2048
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2156 CFX_ByteString word = GetNextWord(&bIsNumber); 2152 CFX_ByteString word = GetNextWord(&bIsNumber);
2157 if (word.GetLength() == 0) 2153 if (word.GetLength() == 0)
2158 return nullptr; 2154 return nullptr;
2159 2155
2160 if (bIsNumber) { 2156 if (bIsNumber) {
2161 FX_FILESIZE SavedPos = m_Pos; 2157 FX_FILESIZE SavedPos = m_Pos;
2162 CFX_ByteString nextword = GetNextWord(&bIsNumber); 2158 CFX_ByteString nextword = GetNextWord(&bIsNumber);
2163 if (bIsNumber) { 2159 if (bIsNumber) {
2164 CFX_ByteString nextword2 = GetNextWord(nullptr); 2160 CFX_ByteString nextword2 = GetNextWord(nullptr);
2165 if (nextword2 == "R") 2161 if (nextword2 == "R")
2166 return new CPDF_Reference(pObjList, FXSYS_atoi(word)); 2162 return new CPDF_Reference(pObjList, FXSYS_atoui(word));
2167 } 2163 }
2168 m_Pos = SavedPos; 2164 m_Pos = SavedPos;
2169 return new CPDF_Number(word); 2165 return new CPDF_Number(word);
2170 } 2166 }
2171 2167
2172 if (word == "true" || word == "false") 2168 if (word == "true" || word == "false")
2173 return new CPDF_Boolean(word == "true"); 2169 return new CPDF_Boolean(word == "true");
2174 2170
2175 if (word == "null") 2171 if (word == "null")
2176 return new CPDF_Null; 2172 return new CPDF_Null;
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
2433 m_HeaderOffset = HeaderOffset; 2429 m_HeaderOffset = HeaderOffset;
2434 m_FileLen = pFileAccess->GetSize(); 2430 m_FileLen = pFileAccess->GetSize();
2435 m_Pos = 0; 2431 m_Pos = 0;
2436 m_pFileAccess = pFileAccess; 2432 m_pFileAccess = pFileAccess;
2437 m_BufOffset = 0; 2433 m_BufOffset = 0;
2438 pFileAccess->ReadBlock( 2434 pFileAccess->ReadBlock(
2439 m_pFileBuf, 0, 2435 m_pFileBuf, 0,
2440 (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize)); 2436 (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));
2441 } 2437 }
2442 2438
2443 int32_t CPDF_SyntaxParser::GetDirectNum() { 2439 uint32_t CPDF_SyntaxParser::GetDirectNum() {
2444 bool bIsNumber; 2440 bool bIsNumber;
2445 GetNextWordInternal(&bIsNumber); 2441 GetNextWordInternal(&bIsNumber);
2446 if (!bIsNumber) 2442 if (!bIsNumber)
2447 return 0; 2443 return 0;
2448 2444
2449 m_WordBuffer[m_WordSize] = 0; 2445 m_WordBuffer[m_WordSize] = 0;
2450 return FXSYS_atoi(reinterpret_cast<const FX_CHAR*>(m_WordBuffer)); 2446 return FXSYS_atoui(reinterpret_cast<const FX_CHAR*>(m_WordBuffer));
2451 } 2447 }
2452 2448
2453 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, 2449 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos,
2454 FX_FILESIZE limit, 2450 FX_FILESIZE limit,
2455 const CFX_ByteStringC& tag, 2451 const CFX_ByteStringC& tag,
2456 FX_BOOL checkKeyword) { 2452 FX_BOOL checkKeyword) {
2457 const FX_DWORD taglen = tag.GetLength(); 2453 const FX_DWORD taglen = tag.GetLength();
2458 2454
2459 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]); 2455 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]);
2460 bool bCheckRight = !PDFCharIsDelimiter(tag[taglen - 1]) && 2456 bool bCheckRight = !PDFCharIsDelimiter(tag[taglen - 1]) &&
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after
3547 FX_DWORD objnum, 3543 FX_DWORD objnum,
3548 CPDF_IndirectObjectHolder* pObjList) { 3544 CPDF_IndirectObjectHolder* pObjList) {
3549 FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); 3545 FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
3550 m_syntaxParser.RestorePos(pos); 3546 m_syntaxParser.RestorePos(pos);
3551 3547
3552 bool bIsNumber; 3548 bool bIsNumber;
3553 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber); 3549 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber);
3554 if (!bIsNumber) 3550 if (!bIsNumber)
3555 return nullptr; 3551 return nullptr;
3556 3552
3557 FX_DWORD parser_objnum = FXSYS_atoi(word); 3553 FX_DWORD parser_objnum = FXSYS_atoui(word);
3558 if (objnum && parser_objnum != objnum) 3554 if (objnum && parser_objnum != objnum)
3559 return nullptr; 3555 return nullptr;
3560 3556
3561 word = m_syntaxParser.GetNextWord(&bIsNumber); 3557 word = m_syntaxParser.GetNextWord(&bIsNumber);
3562 if (!bIsNumber) 3558 if (!bIsNumber)
3563 return nullptr; 3559 return nullptr;
3564 3560
3565 FX_DWORD gennum = FXSYS_atoi(word); 3561 FX_DWORD gennum = FXSYS_atoui(word);
3566 if (m_syntaxParser.GetKeyword() != "obj") { 3562 if (m_syntaxParser.GetKeyword() != "obj") {
3567 m_syntaxParser.RestorePos(SavedPos); 3563 m_syntaxParser.RestorePos(SavedPos);
3568 return nullptr; 3564 return nullptr;
3569 } 3565 }
3570 3566
3571 CPDF_Object* pObj = 3567 CPDF_Object* pObj =
3572 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, true); 3568 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, true);
3573 m_syntaxParser.RestorePos(SavedPos); 3569 m_syntaxParser.RestorePos(SavedPos);
3574 return pObj; 3570 return pObj;
3575 } 3571 }
(...skipping 28 matching lines...) Expand all
3604 3600
3605 m_dwHeaderOffset = offset; 3601 m_dwHeaderOffset = offset;
3606 m_syntaxParser.InitParser(file.get(), offset); 3602 m_syntaxParser.InitParser(file.get(), offset);
3607 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); 3603 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);
3608 3604
3609 bool bNumber; 3605 bool bNumber;
3610 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(&bNumber); 3606 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(&bNumber);
3611 if (!bNumber) 3607 if (!bNumber)
3612 return FALSE; 3608 return FALSE;
3613 3609
3614 FX_DWORD objnum = FXSYS_atoi(wordObjNum); 3610 FX_DWORD objnum = FXSYS_atoui(wordObjNum);
3615 if (m_pLinearized) { 3611 if (m_pLinearized) {
3616 m_pLinearized->Release(); 3612 m_pLinearized->Release();
3617 m_pLinearized = nullptr; 3613 m_pLinearized = nullptr;
3618 } 3614 }
3619 3615
3620 m_pLinearized = 3616 m_pLinearized =
3621 ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum); 3617 ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);
3622 if (!m_pLinearized) 3618 if (!m_pLinearized)
3623 return FALSE; 3619 return FALSE;
3624 3620
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3697 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); 3693 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);
3698 3694
3699 ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); 3695 ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
3700 m_parser.m_Syntax.InitParser(file.get(), 0); 3696 m_parser.m_Syntax.InitParser(file.get(), 0);
3701 3697
3702 bool bNumber; 3698 bool bNumber;
3703 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(&bNumber); 3699 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(&bNumber);
3704 if (!bNumber) 3700 if (!bNumber)
3705 return -1; 3701 return -1;
3706 3702
3707 FX_DWORD objNum = FXSYS_atoi(objnum); 3703 FX_DWORD objNum = FXSYS_atoui(objnum);
3708 CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(nullptr, 0, objNum); 3704 CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(nullptr, 0, objNum);
3709 if (!pObj) { 3705 if (!pObj) {
3710 m_Pos += m_parser.m_Syntax.SavePos(); 3706 m_Pos += m_parser.m_Syntax.SavePos();
3711 return 0; 3707 return 0;
3712 } 3708 }
3713 3709
3714 CPDF_Dictionary* pDict = pObj->GetDict(); 3710 CPDF_Dictionary* pDict = pObj->GetDict();
3715 CPDF_Name* pName = ToName(pDict ? pDict->GetElement("Type") : nullptr); 3711 CPDF_Name* pName = ToName(pDict ? pDict->GetElement("Type") : nullptr);
3716 if (pName) { 3712 if (pName) {
3717 if (pName->GetString() == "XRef") { 3713 if (pName->GetString() == "XRef") {
(...skipping 1312 matching lines...) Expand 10 before | Expand all | Expand 10 after
5030 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); 5026 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H");
5031 if (!pRange) 5027 if (!pRange)
5032 return -1; 5028 return -1;
5033 5029
5034 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 5030 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
5035 if (!pStreamLen) 5031 if (!pStreamLen)
5036 return -1; 5032 return -1;
5037 5033
5038 return pStreamLen->GetInteger(); 5034 return pStreamLen->GetInteger();
5039 } 5035 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp ('k') | core/src/fxcrt/fx_basic_gcc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698