| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/fpdfapi/fpdf_parser/include/cpdf_parser.h" | 7 #include "core/fpdfapi/fpdf_parser/include/cpdf_parser.h" |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 FX_BOOL bXRefRebuilt = FALSE; | 195 FX_BOOL bXRefRebuilt = FALSE; |
| 196 if (m_pSyntax->SearchWord("startxref", TRUE, FALSE, 4096)) { | 196 if (m_pSyntax->SearchWord("startxref", TRUE, FALSE, 4096)) { |
| 197 m_SortedOffset.insert(m_pSyntax->SavePos()); | 197 m_SortedOffset.insert(m_pSyntax->SavePos()); |
| 198 m_pSyntax->GetKeyword(); | 198 m_pSyntax->GetKeyword(); |
| 199 | 199 |
| 200 bool bNumber; | 200 bool bNumber; |
| 201 CFX_ByteString xrefpos_str = m_pSyntax->GetNextWord(&bNumber); | 201 CFX_ByteString xrefpos_str = m_pSyntax->GetNextWord(&bNumber); |
| 202 if (!bNumber) | 202 if (!bNumber) |
| 203 return FORMAT_ERROR; | 203 return FORMAT_ERROR; |
| 204 | 204 |
| 205 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); | 205 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str.c_str()); |
| 206 if (!LoadAllCrossRefV4(m_LastXRefOffset) && | 206 if (!LoadAllCrossRefV4(m_LastXRefOffset) && |
| 207 !LoadAllCrossRefV5(m_LastXRefOffset)) { | 207 !LoadAllCrossRefV5(m_LastXRefOffset)) { |
| 208 if (!RebuildCrossRef()) | 208 if (!RebuildCrossRef()) |
| 209 return FORMAT_ERROR; | 209 return FORMAT_ERROR; |
| 210 | 210 |
| 211 bXRefRebuilt = TRUE; | 211 bXRefRebuilt = TRUE; |
| 212 m_LastXRefOffset = 0; | 212 m_LastXRefOffset = 0; |
| 213 } | 213 } |
| 214 } else { | 214 } else { |
| 215 if (!RebuildCrossRef()) | 215 if (!RebuildCrossRef()) |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 bool bIsNumber; | 498 bool bIsNumber; |
| 499 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); | 499 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); |
| 500 if (word.IsEmpty()) | 500 if (word.IsEmpty()) |
| 501 return false; | 501 return false; |
| 502 | 502 |
| 503 if (!bIsNumber) { | 503 if (!bIsNumber) { |
| 504 m_pSyntax->RestorePos(SavedPos); | 504 m_pSyntax->RestorePos(SavedPos); |
| 505 break; | 505 break; |
| 506 } | 506 } |
| 507 | 507 |
| 508 uint32_t start_objnum = FXSYS_atoui(word); | 508 uint32_t start_objnum = FXSYS_atoui(word.c_str()); |
| 509 if (start_objnum >= kMaxObjectNumber) | 509 if (start_objnum >= kMaxObjectNumber) |
| 510 return false; | 510 return false; |
| 511 | 511 |
| 512 uint32_t count = m_pSyntax->GetDirectNum(); | 512 uint32_t count = m_pSyntax->GetDirectNum(); |
| 513 m_pSyntax->ToNextWord(); | 513 m_pSyntax->ToNextWord(); |
| 514 SavedPos = m_pSyntax->SavePos(); | 514 SavedPos = m_pSyntax->SavePos(); |
| 515 const int32_t recordsize = 20; | 515 const int32_t recordsize = 20; |
| 516 | 516 |
| 517 m_dwXrefStartObjNum = start_objnum; | 517 m_dwXrefStartObjNum = start_objnum; |
| 518 if (!bSkip) { | 518 if (!bSkip) { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 m_pTrailer = pTrailer; | 839 m_pTrailer = pTrailer; |
| 840 } | 840 } |
| 841 | 841 |
| 842 FX_FILESIZE dwSavePos = m_pSyntax->SavePos(); | 842 FX_FILESIZE dwSavePos = m_pSyntax->SavePos(); |
| 843 CFX_ByteString strWord = m_pSyntax->GetKeyword(); | 843 CFX_ByteString strWord = m_pSyntax->GetKeyword(); |
| 844 if (!strWord.Compare("startxref")) { | 844 if (!strWord.Compare("startxref")) { |
| 845 bool bNumber; | 845 bool bNumber; |
| 846 CFX_ByteString bsOffset = | 846 CFX_ByteString bsOffset = |
| 847 m_pSyntax->GetNextWord(&bNumber); | 847 m_pSyntax->GetNextWord(&bNumber); |
| 848 if (bNumber) | 848 if (bNumber) |
| 849 m_LastXRefOffset = FXSYS_atoi(bsOffset); | 849 m_LastXRefOffset = FXSYS_atoi(bsOffset.c_str()); |
| 850 } | 850 } |
| 851 m_pSyntax->RestorePos(dwSavePos); | 851 m_pSyntax->RestorePos(dwSavePos); |
| 852 } | 852 } |
| 853 } else { | 853 } else { |
| 854 pObj->Release(); | 854 pObj->Release(); |
| 855 } | 855 } |
| 856 } | 856 } |
| 857 } | 857 } |
| 858 } | 858 } |
| 859 --i; | 859 --i; |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); | 1286 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); |
| 1287 m_pSyntax->RestorePos(pos); | 1287 m_pSyntax->RestorePos(pos); |
| 1288 | 1288 |
| 1289 bool bIsNumber; | 1289 bool bIsNumber; |
| 1290 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); | 1290 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1291 if (!bIsNumber) { | 1291 if (!bIsNumber) { |
| 1292 m_pSyntax->RestorePos(SavedPos); | 1292 m_pSyntax->RestorePos(SavedPos); |
| 1293 return; | 1293 return; |
| 1294 } | 1294 } |
| 1295 | 1295 |
| 1296 uint32_t parser_objnum = FXSYS_atoui(word); | 1296 uint32_t parser_objnum = FXSYS_atoui(word.c_str()); |
| 1297 if (parser_objnum && parser_objnum != objnum) { | 1297 if (parser_objnum && parser_objnum != objnum) { |
| 1298 m_pSyntax->RestorePos(SavedPos); | 1298 m_pSyntax->RestorePos(SavedPos); |
| 1299 return; | 1299 return; |
| 1300 } | 1300 } |
| 1301 | 1301 |
| 1302 word = m_pSyntax->GetNextWord(&bIsNumber); | 1302 word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1303 if (!bIsNumber) { | 1303 if (!bIsNumber) { |
| 1304 m_pSyntax->RestorePos(SavedPos); | 1304 m_pSyntax->RestorePos(SavedPos); |
| 1305 return; | 1305 return; |
| 1306 } | 1306 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1358 m_pSyntax->RestorePos(pos); | 1358 m_pSyntax->RestorePos(pos); |
| 1359 bool bIsNumber; | 1359 bool bIsNumber; |
| 1360 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); | 1360 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1361 if (!bIsNumber) { | 1361 if (!bIsNumber) { |
| 1362 m_pSyntax->RestorePos(SavedPos); | 1362 m_pSyntax->RestorePos(SavedPos); |
| 1363 return nullptr; | 1363 return nullptr; |
| 1364 } | 1364 } |
| 1365 | 1365 |
| 1366 FX_FILESIZE objOffset = m_pSyntax->SavePos(); | 1366 FX_FILESIZE objOffset = m_pSyntax->SavePos(); |
| 1367 objOffset -= word.GetLength(); | 1367 objOffset -= word.GetLength(); |
| 1368 uint32_t parser_objnum = FXSYS_atoui(word); | 1368 uint32_t parser_objnum = FXSYS_atoui(word.c_str()); |
| 1369 if (objnum && parser_objnum != objnum) { | 1369 if (objnum && parser_objnum != objnum) { |
| 1370 m_pSyntax->RestorePos(SavedPos); | 1370 m_pSyntax->RestorePos(SavedPos); |
| 1371 return nullptr; | 1371 return nullptr; |
| 1372 } | 1372 } |
| 1373 | 1373 |
| 1374 word = m_pSyntax->GetNextWord(&bIsNumber); | 1374 word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1375 if (!bIsNumber) { | 1375 if (!bIsNumber) { |
| 1376 m_pSyntax->RestorePos(SavedPos); | 1376 m_pSyntax->RestorePos(SavedPos); |
| 1377 return nullptr; | 1377 return nullptr; |
| 1378 } | 1378 } |
| 1379 | 1379 |
| 1380 uint32_t parser_gennum = FXSYS_atoui(word); | 1380 uint32_t parser_gennum = FXSYS_atoui(word.c_str()); |
| 1381 if (m_pSyntax->GetKeyword() != "obj") { | 1381 if (m_pSyntax->GetKeyword() != "obj") { |
| 1382 m_pSyntax->RestorePos(SavedPos); | 1382 m_pSyntax->RestorePos(SavedPos); |
| 1383 return nullptr; | 1383 return nullptr; |
| 1384 } | 1384 } |
| 1385 | 1385 |
| 1386 CPDF_Object* pObj = | 1386 CPDF_Object* pObj = |
| 1387 m_pSyntax->GetObject(pObjList, objnum, parser_gennum, true); | 1387 m_pSyntax->GetObject(pObjList, objnum, parser_gennum, true); |
| 1388 m_pSyntax->SavePos(); | 1388 m_pSyntax->SavePos(); |
| 1389 | 1389 |
| 1390 CFX_ByteString bsWord = m_pSyntax->GetKeyword(); | 1390 CFX_ByteString bsWord = m_pSyntax->GetKeyword(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1408 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); | 1408 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); |
| 1409 m_pSyntax->RestorePos(pos); | 1409 m_pSyntax->RestorePos(pos); |
| 1410 | 1410 |
| 1411 bool bIsNumber; | 1411 bool bIsNumber; |
| 1412 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); | 1412 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1413 if (!bIsNumber) { | 1413 if (!bIsNumber) { |
| 1414 m_pSyntax->RestorePos(SavedPos); | 1414 m_pSyntax->RestorePos(SavedPos); |
| 1415 return nullptr; | 1415 return nullptr; |
| 1416 } | 1416 } |
| 1417 | 1417 |
| 1418 uint32_t parser_objnum = FXSYS_atoui(word); | 1418 uint32_t parser_objnum = FXSYS_atoui(word.c_str()); |
| 1419 if (objnum && parser_objnum != objnum) { | 1419 if (objnum && parser_objnum != objnum) { |
| 1420 m_pSyntax->RestorePos(SavedPos); | 1420 m_pSyntax->RestorePos(SavedPos); |
| 1421 return nullptr; | 1421 return nullptr; |
| 1422 } | 1422 } |
| 1423 | 1423 |
| 1424 word = m_pSyntax->GetNextWord(&bIsNumber); | 1424 word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1425 if (!bIsNumber) { | 1425 if (!bIsNumber) { |
| 1426 m_pSyntax->RestorePos(SavedPos); | 1426 m_pSyntax->RestorePos(SavedPos); |
| 1427 return nullptr; | 1427 return nullptr; |
| 1428 } | 1428 } |
| 1429 | 1429 |
| 1430 uint32_t gennum = FXSYS_atoui(word); | 1430 uint32_t gennum = FXSYS_atoui(word.c_str()); |
| 1431 if (m_pSyntax->GetKeyword() != "obj") { | 1431 if (m_pSyntax->GetKeyword() != "obj") { |
| 1432 m_pSyntax->RestorePos(SavedPos); | 1432 m_pSyntax->RestorePos(SavedPos); |
| 1433 return nullptr; | 1433 return nullptr; |
| 1434 } | 1434 } |
| 1435 | 1435 |
| 1436 CPDF_Object* pObj = m_pSyntax->GetObjectByStrict(pObjList, objnum, gennum); | 1436 CPDF_Object* pObj = m_pSyntax->GetObjectByStrict(pObjList, objnum, gennum); |
| 1437 if (pResultPos) | 1437 if (pResultPos) |
| 1438 *pResultPos = m_pSyntax->m_Pos; | 1438 *pResultPos = m_pSyntax->m_Pos; |
| 1439 | 1439 |
| 1440 m_pSyntax->RestorePos(SavedPos); | 1440 m_pSyntax->RestorePos(SavedPos); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1470 uint32_t offset) { | 1470 uint32_t offset) { |
| 1471 m_pSyntax->InitParser(pFileAccess, offset); | 1471 m_pSyntax->InitParser(pFileAccess, offset); |
| 1472 m_pSyntax->RestorePos(m_pSyntax->m_HeaderOffset + 9); | 1472 m_pSyntax->RestorePos(m_pSyntax->m_HeaderOffset + 9); |
| 1473 | 1473 |
| 1474 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); | 1474 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); |
| 1475 bool bIsNumber; | 1475 bool bIsNumber; |
| 1476 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); | 1476 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1477 if (!bIsNumber) | 1477 if (!bIsNumber) |
| 1478 return FALSE; | 1478 return FALSE; |
| 1479 | 1479 |
| 1480 uint32_t objnum = FXSYS_atoui(word); | 1480 uint32_t objnum = FXSYS_atoui(word.c_str()); |
| 1481 word = m_pSyntax->GetNextWord(&bIsNumber); | 1481 word = m_pSyntax->GetNextWord(&bIsNumber); |
| 1482 if (!bIsNumber) | 1482 if (!bIsNumber) |
| 1483 return FALSE; | 1483 return FALSE; |
| 1484 | 1484 |
| 1485 uint32_t gennum = FXSYS_atoui(word); | 1485 uint32_t gennum = FXSYS_atoui(word.c_str()); |
| 1486 if (m_pSyntax->GetKeyword() != "obj") { | 1486 if (m_pSyntax->GetKeyword() != "obj") { |
| 1487 m_pSyntax->RestorePos(SavedPos); | 1487 m_pSyntax->RestorePos(SavedPos); |
| 1488 return FALSE; | 1488 return FALSE; |
| 1489 } | 1489 } |
| 1490 | 1490 |
| 1491 m_pLinearized = m_pSyntax->GetObject(nullptr, objnum, gennum, true); | 1491 m_pLinearized = m_pSyntax->GetObject(nullptr, objnum, gennum, true); |
| 1492 if (!m_pLinearized) | 1492 if (!m_pLinearized) |
| 1493 return FALSE; | 1493 return FALSE; |
| 1494 | 1494 |
| 1495 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); | 1495 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && | 1643 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && |
| 1644 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { | 1644 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { |
| 1645 m_LastXRefOffset = 0; | 1645 m_LastXRefOffset = 0; |
| 1646 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; | 1646 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; |
| 1647 return FORMAT_ERROR; | 1647 return FORMAT_ERROR; |
| 1648 } | 1648 } |
| 1649 | 1649 |
| 1650 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; | 1650 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; |
| 1651 return SUCCESS; | 1651 return SUCCESS; |
| 1652 } | 1652 } |
| OLD | NEW |