| OLD | NEW |
| 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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 for (int32_t i = 0; i < iLen; ++i) { | 172 for (int32_t i = 0; i < iLen; ++i) { |
| 173 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) | 173 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) |
| 174 trailer->Release(); | 174 trailer->Release(); |
| 175 } | 175 } |
| 176 m_Trailers.RemoveAll(); | 176 m_Trailers.RemoveAll(); |
| 177 if (m_pLinearized) { | 177 if (m_pLinearized) { |
| 178 m_pLinearized->Release(); | 178 m_pLinearized->Release(); |
| 179 m_pLinearized = NULL; | 179 m_pLinearized = NULL; |
| 180 } | 180 } |
| 181 } | 181 } |
| 182 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); | 182 |
| 183 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); | 183 CPDF_Parser::Error CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, |
| 184 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, | 184 FX_BOOL bReParse, |
| 185 FX_BOOL bReParse, | 185 FX_BOOL bOwnFileRead) { |
| 186 FX_BOOL bOwnFileRead) { | |
| 187 CloseParser(bReParse); | 186 CloseParser(bReParse); |
| 188 m_bXRefStream = FALSE; | 187 m_bXRefStream = FALSE; |
| 189 m_LastXRefOffset = 0; | 188 m_LastXRefOffset = 0; |
| 190 m_bOwnFileRead = bOwnFileRead; | 189 m_bOwnFileRead = bOwnFileRead; |
| 191 | 190 |
| 192 int32_t offset = GetHeaderOffset(pFileAccess); | 191 int32_t offset = GetHeaderOffset(pFileAccess); |
| 193 if (offset == -1) { | 192 if (offset == -1) { |
| 194 if (bOwnFileRead && pFileAccess) | 193 if (bOwnFileRead && pFileAccess) |
| 195 pFileAccess->Release(); | 194 pFileAccess->Release(); |
| 196 return PDFPARSE_ERROR_FORMAT; | 195 return FORMAT_ERROR; |
| 197 } | 196 } |
| 198 m_Syntax.InitParser(pFileAccess, offset); | 197 m_Syntax.InitParser(pFileAccess, offset); |
| 199 | 198 |
| 200 uint8_t ch; | 199 uint8_t ch; |
| 201 if (!m_Syntax.GetCharAt(5, ch)) | 200 if (!m_Syntax.GetCharAt(5, ch)) |
| 202 return PDFPARSE_ERROR_FORMAT; | 201 return FORMAT_ERROR; |
| 203 if (std::isdigit(ch)) | 202 if (std::isdigit(ch)) |
| 204 m_FileVersion = FXSYS_toDecimalDigit(ch) * 10; | 203 m_FileVersion = FXSYS_toDecimalDigit(ch) * 10; |
| 205 | 204 |
| 206 if (!m_Syntax.GetCharAt(7, ch)) | 205 if (!m_Syntax.GetCharAt(7, ch)) |
| 207 return PDFPARSE_ERROR_FORMAT; | 206 return FORMAT_ERROR; |
| 208 if (std::isdigit(ch)) | 207 if (std::isdigit(ch)) |
| 209 m_FileVersion += FXSYS_toDecimalDigit(ch); | 208 m_FileVersion += FXSYS_toDecimalDigit(ch); |
| 210 | 209 |
| 211 if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) | 210 if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) |
| 212 return PDFPARSE_ERROR_FORMAT; | 211 return FORMAT_ERROR; |
| 213 | 212 |
| 214 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); | 213 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); |
| 215 if (!bReParse) | 214 if (!bReParse) |
| 216 m_pDocument = new CPDF_Document(this); | 215 m_pDocument = new CPDF_Document(this); |
| 217 | 216 |
| 218 FX_BOOL bXRefRebuilt = FALSE; | 217 FX_BOOL bXRefRebuilt = FALSE; |
| 219 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { | 218 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { |
| 220 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); | 219 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); |
| 221 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), | 220 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), |
| 222 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), | 221 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), |
| 223 CompareFileSize); | 222 CompareFileSize); |
| 224 if (!pResult) | 223 if (!pResult) |
| 225 m_SortedOffset.Add(startxref_offset); | 224 m_SortedOffset.Add(startxref_offset); |
| 226 | 225 |
| 227 m_Syntax.GetKeyword(); | 226 m_Syntax.GetKeyword(); |
| 228 bool bNumber; | 227 bool bNumber; |
| 229 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber); | 228 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber); |
| 230 if (!bNumber) | 229 if (!bNumber) |
| 231 return PDFPARSE_ERROR_FORMAT; | 230 return FORMAT_ERROR; |
| 232 | 231 |
| 233 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); | 232 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); |
| 234 if (!LoadAllCrossRefV4(m_LastXRefOffset) && | 233 if (!LoadAllCrossRefV4(m_LastXRefOffset) && |
| 235 !LoadAllCrossRefV5(m_LastXRefOffset)) { | 234 !LoadAllCrossRefV5(m_LastXRefOffset)) { |
| 236 if (!RebuildCrossRef()) | 235 if (!RebuildCrossRef()) |
| 237 return PDFPARSE_ERROR_FORMAT; | 236 return FORMAT_ERROR; |
| 238 | 237 |
| 239 bXRefRebuilt = TRUE; | 238 bXRefRebuilt = TRUE; |
| 240 m_LastXRefOffset = 0; | 239 m_LastXRefOffset = 0; |
| 241 } | 240 } |
| 242 } else { | 241 } else { |
| 243 if (!RebuildCrossRef()) | 242 if (!RebuildCrossRef()) |
| 244 return PDFPARSE_ERROR_FORMAT; | 243 return FORMAT_ERROR; |
| 245 | 244 |
| 246 bXRefRebuilt = TRUE; | 245 bXRefRebuilt = TRUE; |
| 247 } | 246 } |
| 248 FX_DWORD dwRet = SetEncryptHandler(); | 247 Error eRet = SetEncryptHandler(); |
| 249 if (dwRet != PDFPARSE_ERROR_SUCCESS) | 248 if (eRet != SUCCESS) |
| 250 return dwRet; | 249 return eRet; |
| 251 | 250 |
| 252 m_pDocument->LoadDoc(); | 251 m_pDocument->LoadDoc(); |
| 253 if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { | 252 if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { |
| 254 if (bXRefRebuilt) | 253 if (bXRefRebuilt) |
| 255 return PDFPARSE_ERROR_FORMAT; | 254 return FORMAT_ERROR; |
| 256 | 255 |
| 257 ReleaseEncryptHandler(); | 256 ReleaseEncryptHandler(); |
| 258 if (!RebuildCrossRef()) | 257 if (!RebuildCrossRef()) |
| 259 return PDFPARSE_ERROR_FORMAT; | 258 return FORMAT_ERROR; |
| 260 | 259 |
| 261 dwRet = SetEncryptHandler(); | 260 eRet = SetEncryptHandler(); |
| 262 if (dwRet != PDFPARSE_ERROR_SUCCESS) | 261 if (eRet != SUCCESS) |
| 263 return dwRet; | 262 return eRet; |
| 264 | 263 |
| 265 m_pDocument->LoadDoc(); | 264 m_pDocument->LoadDoc(); |
| 266 if (!m_pDocument->GetRoot()) | 265 if (!m_pDocument->GetRoot()) |
| 267 return PDFPARSE_ERROR_FORMAT; | 266 return FORMAT_ERROR; |
| 268 } | 267 } |
| 269 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 268 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| 270 sizeof(FX_FILESIZE), CompareFileSize); | 269 sizeof(FX_FILESIZE), CompareFileSize); |
| 271 if (GetRootObjNum() == 0) { | 270 if (GetRootObjNum() == 0) { |
| 272 ReleaseEncryptHandler(); | 271 ReleaseEncryptHandler(); |
| 273 if (!RebuildCrossRef() || GetRootObjNum() == 0) | 272 if (!RebuildCrossRef() || GetRootObjNum() == 0) |
| 274 return PDFPARSE_ERROR_FORMAT; | 273 return FORMAT_ERROR; |
| 275 | 274 |
| 276 dwRet = SetEncryptHandler(); | 275 eRet = SetEncryptHandler(); |
| 277 if (dwRet != PDFPARSE_ERROR_SUCCESS) | 276 if (eRet != SUCCESS) |
| 278 return dwRet; | 277 return eRet; |
| 279 } | 278 } |
| 280 if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { | 279 if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { |
| 281 CPDF_Reference* pMetadata = | 280 CPDF_Reference* pMetadata = |
| 282 ToReference(m_pDocument->GetRoot()->GetElement("Metadata")); | 281 ToReference(m_pDocument->GetRoot()->GetElement("Metadata")); |
| 283 if (pMetadata) | 282 if (pMetadata) |
| 284 m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); | 283 m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); |
| 285 } | 284 } |
| 286 return PDFPARSE_ERROR_SUCCESS; | 285 return SUCCESS; |
| 287 } | 286 } |
| 288 FX_DWORD CPDF_Parser::SetEncryptHandler() { | 287 CPDF_Parser::Error CPDF_Parser::SetEncryptHandler() { |
| 289 ReleaseEncryptHandler(); | 288 ReleaseEncryptHandler(); |
| 290 SetEncryptDictionary(NULL); | 289 SetEncryptDictionary(NULL); |
| 291 if (!m_pTrailer) { | 290 if (!m_pTrailer) { |
| 292 return PDFPARSE_ERROR_FORMAT; | 291 return FORMAT_ERROR; |
| 293 } | 292 } |
| 294 CPDF_Object* pEncryptObj = m_pTrailer->GetElement("Encrypt"); | 293 CPDF_Object* pEncryptObj = m_pTrailer->GetElement("Encrypt"); |
| 295 if (pEncryptObj) { | 294 if (pEncryptObj) { |
| 296 if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) { | 295 if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) { |
| 297 SetEncryptDictionary(pEncryptDict); | 296 SetEncryptDictionary(pEncryptDict); |
| 298 } else if (CPDF_Reference* pRef = pEncryptObj->AsReference()) { | 297 } else if (CPDF_Reference* pRef = pEncryptObj->AsReference()) { |
| 299 pEncryptObj = m_pDocument->GetIndirectObject(pRef->GetRefObjNum()); | 298 pEncryptObj = m_pDocument->GetIndirectObject(pRef->GetRefObjNum()); |
| 300 if (pEncryptObj) | 299 if (pEncryptObj) |
| 301 SetEncryptDictionary(pEncryptObj->GetDict()); | 300 SetEncryptDictionary(pEncryptObj->GetDict()); |
| 302 } | 301 } |
| 303 } | 302 } |
| 304 if (m_bForceUseSecurityHandler) { | 303 if (m_bForceUseSecurityHandler) { |
| 305 FX_DWORD err = PDFPARSE_ERROR_HANDLER; | |
| 306 if (!m_pSecurityHandler) { | 304 if (!m_pSecurityHandler) { |
| 307 return PDFPARSE_ERROR_HANDLER; | 305 return HANDLER_ERROR; |
| 308 } | 306 } |
| 309 if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) { | 307 if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) { |
| 310 return err; | 308 return HANDLER_ERROR; |
| 311 } | 309 } |
| 312 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler( | 310 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler( |
| 313 m_pSecurityHandler->CreateCryptoHandler()); | 311 m_pSecurityHandler->CreateCryptoHandler()); |
| 314 if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) { | 312 if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) { |
| 315 return PDFPARSE_ERROR_HANDLER; | 313 return HANDLER_ERROR; |
| 316 } | 314 } |
| 317 m_Syntax.SetEncrypt(pCryptoHandler.release()); | 315 m_Syntax.SetEncrypt(pCryptoHandler.release()); |
| 318 } else if (m_pEncryptDict) { | 316 } else if (m_pEncryptDict) { |
| 319 CFX_ByteString filter = m_pEncryptDict->GetString("Filter"); | 317 CFX_ByteString filter = m_pEncryptDict->GetString("Filter"); |
| 320 std::unique_ptr<CPDF_SecurityHandler> pSecurityHandler; | 318 std::unique_ptr<CPDF_SecurityHandler> pSecurityHandler; |
| 321 FX_DWORD err = PDFPARSE_ERROR_HANDLER; | 319 Error err = HANDLER_ERROR; |
| 322 if (filter == "Standard") { | 320 if (filter == "Standard") { |
| 323 pSecurityHandler.reset(FPDF_CreateStandardSecurityHandler()); | 321 pSecurityHandler.reset(FPDF_CreateStandardSecurityHandler()); |
| 324 err = PDFPARSE_ERROR_PASSWORD; | 322 err = PASSWORD_ERROR; |
| 325 } | 323 } |
| 326 if (!pSecurityHandler) { | 324 if (!pSecurityHandler) { |
| 327 return PDFPARSE_ERROR_HANDLER; | 325 return HANDLER_ERROR; |
| 328 } | 326 } |
| 329 if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) { | 327 if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) { |
| 330 return err; | 328 return err; |
| 331 } | 329 } |
| 332 m_pSecurityHandler = std::move(pSecurityHandler); | 330 m_pSecurityHandler = std::move(pSecurityHandler); |
| 333 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler( | 331 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler( |
| 334 m_pSecurityHandler->CreateCryptoHandler()); | 332 m_pSecurityHandler->CreateCryptoHandler()); |
| 335 if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) { | 333 if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) { |
| 336 return PDFPARSE_ERROR_HANDLER; | 334 return HANDLER_ERROR; |
| 337 } | 335 } |
| 338 m_Syntax.SetEncrypt(pCryptoHandler.release()); | 336 m_Syntax.SetEncrypt(pCryptoHandler.release()); |
| 339 } | 337 } |
| 340 return PDFPARSE_ERROR_SUCCESS; | 338 return SUCCESS; |
| 341 } | 339 } |
| 342 void CPDF_Parser::ReleaseEncryptHandler() { | 340 void CPDF_Parser::ReleaseEncryptHandler() { |
| 343 m_Syntax.m_pCryptoHandler.reset(); | 341 m_Syntax.m_pCryptoHandler.reset(); |
| 344 if (!m_bForceUseSecurityHandler) { | 342 if (!m_bForceUseSecurityHandler) { |
| 345 m_pSecurityHandler.reset(); | 343 m_pSecurityHandler.reset(); |
| 346 } | 344 } |
| 347 } | 345 } |
| 348 | 346 |
| 349 FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) const { | 347 FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) const { |
| 350 if (!IsValidObjectNumber(objnum)) | 348 if (!IsValidObjectNumber(objnum)) |
| (...skipping 1204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 | 1553 |
| 1556 if (CPDF_Number* pTable = ToNumber(pDict->GetElement("T"))) | 1554 if (CPDF_Number* pTable = ToNumber(pDict->GetElement("T"))) |
| 1557 m_LastXRefOffset = pTable->GetInteger(); | 1555 m_LastXRefOffset = pTable->GetInteger(); |
| 1558 | 1556 |
| 1559 return TRUE; | 1557 return TRUE; |
| 1560 } | 1558 } |
| 1561 m_pLinearized->Release(); | 1559 m_pLinearized->Release(); |
| 1562 m_pLinearized = NULL; | 1560 m_pLinearized = NULL; |
| 1563 return FALSE; | 1561 return FALSE; |
| 1564 } | 1562 } |
| 1565 FX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, | 1563 CPDF_Parser::Error CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, |
| 1566 FX_BOOL bReParse, | 1564 FX_BOOL bReParse, |
| 1567 FX_BOOL bOwnFileRead) { | 1565 FX_BOOL bOwnFileRead) { |
| 1568 CloseParser(bReParse); | 1566 CloseParser(bReParse); |
| 1569 m_bXRefStream = FALSE; | 1567 m_bXRefStream = FALSE; |
| 1570 m_LastXRefOffset = 0; | 1568 m_LastXRefOffset = 0; |
| 1571 m_bOwnFileRead = bOwnFileRead; | 1569 m_bOwnFileRead = bOwnFileRead; |
| 1572 int32_t offset = GetHeaderOffset(pFileAccess); | 1570 int32_t offset = GetHeaderOffset(pFileAccess); |
| 1573 if (offset == -1) { | 1571 if (offset == -1) { |
| 1574 return PDFPARSE_ERROR_FORMAT; | 1572 return FORMAT_ERROR; |
| 1575 } | 1573 } |
| 1576 if (!IsLinearizedFile(pFileAccess, offset)) { | 1574 if (!IsLinearizedFile(pFileAccess, offset)) { |
| 1577 m_Syntax.m_pFileAccess = NULL; | 1575 m_Syntax.m_pFileAccess = NULL; |
| 1578 return StartParse(pFileAccess, bReParse, bOwnFileRead); | 1576 return StartParse(pFileAccess, bReParse, bOwnFileRead); |
| 1579 } | 1577 } |
| 1580 if (!bReParse) { | 1578 if (!bReParse) { |
| 1581 m_pDocument = new CPDF_Document(this); | 1579 m_pDocument = new CPDF_Document(this); |
| 1582 } | 1580 } |
| 1583 FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos(); | 1581 FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos(); |
| 1584 FX_BOOL bXRefRebuilt = FALSE; | 1582 FX_BOOL bXRefRebuilt = FALSE; |
| 1585 FX_BOOL bLoadV4 = FALSE; | 1583 FX_BOOL bLoadV4 = FALSE; |
| 1586 if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE)) && | 1584 if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE)) && |
| 1587 !LoadCrossRefV5(&dwFirstXRefOffset, TRUE)) { | 1585 !LoadCrossRefV5(&dwFirstXRefOffset, TRUE)) { |
| 1588 if (!RebuildCrossRef()) { | 1586 if (!RebuildCrossRef()) { |
| 1589 return PDFPARSE_ERROR_FORMAT; | 1587 return FORMAT_ERROR; |
| 1590 } | 1588 } |
| 1591 bXRefRebuilt = TRUE; | 1589 bXRefRebuilt = TRUE; |
| 1592 m_LastXRefOffset = 0; | 1590 m_LastXRefOffset = 0; |
| 1593 } | 1591 } |
| 1594 if (bLoadV4) { | 1592 if (bLoadV4) { |
| 1595 m_pTrailer = LoadTrailerV4(); | 1593 m_pTrailer = LoadTrailerV4(); |
| 1596 if (!m_pTrailer) { | 1594 if (!m_pTrailer) { |
| 1597 return PDFPARSE_ERROR_SUCCESS; | 1595 return SUCCESS; |
| 1598 } | 1596 } |
| 1599 | 1597 |
| 1600 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); | 1598 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); |
| 1601 if (xrefsize > 0) { | 1599 if (xrefsize > 0) { |
| 1602 ShrinkObjectMap(xrefsize); | 1600 ShrinkObjectMap(xrefsize); |
| 1603 m_V5Type.SetSize(xrefsize); | 1601 m_V5Type.SetSize(xrefsize); |
| 1604 } | 1602 } |
| 1605 } | 1603 } |
| 1606 FX_DWORD dwRet = SetEncryptHandler(); | 1604 Error eRet = SetEncryptHandler(); |
| 1607 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 1605 if (eRet != SUCCESS) { |
| 1608 return dwRet; | 1606 return eRet; |
| 1609 } | 1607 } |
| 1610 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); | 1608 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); |
| 1611 if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { | 1609 if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { |
| 1612 if (bXRefRebuilt) { | 1610 if (bXRefRebuilt) { |
| 1613 return PDFPARSE_ERROR_FORMAT; | 1611 return FORMAT_ERROR; |
| 1614 } | 1612 } |
| 1615 ReleaseEncryptHandler(); | 1613 ReleaseEncryptHandler(); |
| 1616 if (!RebuildCrossRef()) { | 1614 if (!RebuildCrossRef()) { |
| 1617 return PDFPARSE_ERROR_FORMAT; | 1615 return FORMAT_ERROR; |
| 1618 } | 1616 } |
| 1619 dwRet = SetEncryptHandler(); | 1617 eRet = SetEncryptHandler(); |
| 1620 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 1618 if (eRet != SUCCESS) { |
| 1621 return dwRet; | 1619 return eRet; |
| 1622 } | 1620 } |
| 1623 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); | 1621 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); |
| 1624 if (!m_pDocument->GetRoot()) { | 1622 if (!m_pDocument->GetRoot()) { |
| 1625 return PDFPARSE_ERROR_FORMAT; | 1623 return FORMAT_ERROR; |
| 1626 } | 1624 } |
| 1627 } | 1625 } |
| 1628 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 1626 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| 1629 sizeof(FX_FILESIZE), CompareFileSize); | 1627 sizeof(FX_FILESIZE), CompareFileSize); |
| 1630 if (GetRootObjNum() == 0) { | 1628 if (GetRootObjNum() == 0) { |
| 1631 ReleaseEncryptHandler(); | 1629 ReleaseEncryptHandler(); |
| 1632 if (!RebuildCrossRef() || GetRootObjNum() == 0) | 1630 if (!RebuildCrossRef() || GetRootObjNum() == 0) |
| 1633 return PDFPARSE_ERROR_FORMAT; | 1631 return FORMAT_ERROR; |
| 1634 | 1632 |
| 1635 dwRet = SetEncryptHandler(); | 1633 eRet = SetEncryptHandler(); |
| 1636 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 1634 if (eRet != SUCCESS) { |
| 1637 return dwRet; | 1635 return eRet; |
| 1638 } | 1636 } |
| 1639 } | 1637 } |
| 1640 if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) { | 1638 if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) { |
| 1641 if (CPDF_Reference* pMetadata = | 1639 if (CPDF_Reference* pMetadata = |
| 1642 ToReference(m_pDocument->GetRoot()->GetElement("Metadata"))) | 1640 ToReference(m_pDocument->GetRoot()->GetElement("Metadata"))) |
| 1643 m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); | 1641 m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); |
| 1644 } | 1642 } |
| 1645 return PDFPARSE_ERROR_SUCCESS; | 1643 return SUCCESS; |
| 1646 } | 1644 } |
| 1647 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos) { | 1645 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos) { |
| 1648 if (!LoadCrossRefV5(&xrefpos, FALSE)) { | 1646 if (!LoadCrossRefV5(&xrefpos, FALSE)) { |
| 1649 return FALSE; | 1647 return FALSE; |
| 1650 } | 1648 } |
| 1651 std::set<FX_FILESIZE> seen_xrefpos; | 1649 std::set<FX_FILESIZE> seen_xrefpos; |
| 1652 while (xrefpos) { | 1650 while (xrefpos) { |
| 1653 seen_xrefpos.insert(xrefpos); | 1651 seen_xrefpos.insert(xrefpos); |
| 1654 if (!LoadCrossRefV5(&xrefpos, FALSE)) { | 1652 if (!LoadCrossRefV5(&xrefpos, FALSE)) { |
| 1655 return FALSE; | 1653 return FALSE; |
| 1656 } | 1654 } |
| 1657 // Check for circular references. | 1655 // Check for circular references. |
| 1658 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) { | 1656 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) { |
| 1659 return FALSE; | 1657 return FALSE; |
| 1660 } | 1658 } |
| 1661 } | 1659 } |
| 1662 m_ObjectStreamMap.clear(); | 1660 m_ObjectStreamMap.clear(); |
| 1663 m_bXRefStream = TRUE; | 1661 m_bXRefStream = TRUE; |
| 1664 return TRUE; | 1662 return TRUE; |
| 1665 } | 1663 } |
| 1666 FX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable() { | 1664 |
| 1665 CPDF_Parser::Error CPDF_Parser::LoadLinearizedMainXRefTable() { |
| 1667 FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; | 1666 FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; |
| 1668 m_Syntax.m_MetadataObjnum = 0; | 1667 m_Syntax.m_MetadataObjnum = 0; |
| 1669 if (m_pTrailer) { | 1668 if (m_pTrailer) { |
| 1670 m_pTrailer->Release(); | 1669 m_pTrailer->Release(); |
| 1671 m_pTrailer = NULL; | 1670 m_pTrailer = NULL; |
| 1672 } | 1671 } |
| 1673 m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); | 1672 m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); |
| 1674 uint8_t ch = 0; | 1673 uint8_t ch = 0; |
| 1675 FX_DWORD dwCount = 0; | 1674 FX_DWORD dwCount = 0; |
| 1676 m_Syntax.GetNextChar(ch); | 1675 m_Syntax.GetNextChar(ch); |
| 1677 while (PDFCharIsWhitespace(ch)) { | 1676 while (PDFCharIsWhitespace(ch)) { |
| 1678 ++dwCount; | 1677 ++dwCount; |
| 1679 if (m_Syntax.m_FileLen >= | 1678 if (m_Syntax.m_FileLen >= |
| 1680 (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) { | 1679 (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) { |
| 1681 break; | 1680 break; |
| 1682 } | 1681 } |
| 1683 m_Syntax.GetNextChar(ch); | 1682 m_Syntax.GetNextChar(ch); |
| 1684 } | 1683 } |
| 1685 m_LastXRefOffset += dwCount; | 1684 m_LastXRefOffset += dwCount; |
| 1686 m_ObjectStreamMap.clear(); | 1685 m_ObjectStreamMap.clear(); |
| 1687 m_ObjCache.clear(); | 1686 m_ObjCache.clear(); |
| 1688 | 1687 |
| 1689 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && | 1688 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && |
| 1690 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { | 1689 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { |
| 1691 m_LastXRefOffset = 0; | 1690 m_LastXRefOffset = 0; |
| 1692 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; | 1691 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; |
| 1693 return PDFPARSE_ERROR_FORMAT; | 1692 return FORMAT_ERROR; |
| 1694 } | 1693 } |
| 1695 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 1694 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| 1696 sizeof(FX_FILESIZE), CompareFileSize); | 1695 sizeof(FX_FILESIZE), CompareFileSize); |
| 1697 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; | 1696 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; |
| 1698 return PDFPARSE_ERROR_SUCCESS; | 1697 return SUCCESS; |
| 1699 } | 1698 } |
| 1700 | 1699 |
| 1701 // static | 1700 // static |
| 1702 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; | 1701 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; |
| 1703 | 1702 |
| 1704 CPDF_SyntaxParser::CPDF_SyntaxParser() { | 1703 CPDF_SyntaxParser::CPDF_SyntaxParser() { |
| 1705 m_pFileAccess = NULL; | 1704 m_pFileAccess = NULL; |
| 1706 m_pFileBuf = NULL; | 1705 m_pFileBuf = NULL; |
| 1707 m_BufSize = CPDF_ModuleMgr::kFileBufSize; | 1706 m_BufSize = CPDF_ModuleMgr::kFileBufSize; |
| 1708 m_pFileBuf = NULL; | 1707 m_pFileBuf = NULL; |
| (...skipping 2492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4201 FX_SAFE_DWORD data_size = m_dwFileLen; | 4200 FX_SAFE_DWORD data_size = m_dwFileLen; |
| 4202 data_size -= m_dwLastXRefOffset; | 4201 data_size -= m_dwLastXRefOffset; |
| 4203 if (!data_size.IsValid()) { | 4202 if (!data_size.IsValid()) { |
| 4204 return DataError; | 4203 return DataError; |
| 4205 } | 4204 } |
| 4206 if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, | 4205 if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, |
| 4207 data_size.ValueOrDie())) { | 4206 data_size.ValueOrDie())) { |
| 4208 pHints->AddSegment(m_dwLastXRefOffset, data_size.ValueOrDie()); | 4207 pHints->AddSegment(m_dwLastXRefOffset, data_size.ValueOrDie()); |
| 4209 return DataNotAvailable; | 4208 return DataNotAvailable; |
| 4210 } | 4209 } |
| 4211 FX_DWORD dwRet = m_pDocument->GetParser()->LoadLinearizedMainXRefTable(); | 4210 CPDF_Parser::Error eRet = |
| 4211 m_pDocument->GetParser()->LoadLinearizedMainXRefTable(); |
| 4212 m_bMainXRefLoadTried = TRUE; | 4212 m_bMainXRefLoadTried = TRUE; |
| 4213 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 4213 if (eRet != CPDF_Parser::SUCCESS) { |
| 4214 return DataError; | 4214 return DataError; |
| 4215 } | 4215 } |
| 4216 if (!PreparePageItem()) { | 4216 if (!PreparePageItem()) { |
| 4217 return DataNotAvailable; | 4217 return DataNotAvailable; |
| 4218 } | 4218 } |
| 4219 m_bMainXRefLoadedOK = TRUE; | 4219 m_bMainXRefLoadedOK = TRUE; |
| 4220 m_bLinearedDataOK = TRUE; | 4220 m_bLinearedDataOK = TRUE; |
| 4221 } | 4221 } |
| 4222 | 4222 |
| 4223 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; | 4223 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4887 if (!m_pLinearizedDict) | 4887 if (!m_pLinearizedDict) |
| 4888 return -1; | 4888 return -1; |
| 4889 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); | 4889 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); |
| 4890 if (!pRange) | 4890 if (!pRange) |
| 4891 return -1; | 4891 return -1; |
| 4892 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4892 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
| 4893 if (!pStreamLen) | 4893 if (!pStreamLen) |
| 4894 return -1; | 4894 return -1; |
| 4895 return pStreamLen->GetInteger(); | 4895 return pStreamLen->GetInteger(); |
| 4896 } | 4896 } |
| OLD | NEW |