| 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/parser/cpdf_syntax_parser.h" | 7 #include "core/fpdfapi/parser/cpdf_syntax_parser.h" | 
| 8 | 8 | 
| 9 #include <vector> | 9 #include <vector> | 
| 10 | 10 | 
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 434 | 434 | 
| 435   if (word[0] == '/') { | 435   if (word[0] == '/') { | 
| 436     return new CPDF_Name(MaybeIntern( | 436     return new CPDF_Name(MaybeIntern( | 
| 437         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); | 437         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); | 
| 438   } | 438   } | 
| 439 | 439 | 
| 440   if (word == "<<") { | 440   if (word == "<<") { | 
| 441     int32_t nKeys = 0; | 441     int32_t nKeys = 0; | 
| 442     FX_FILESIZE dwSignValuePos = 0; | 442     FX_FILESIZE dwSignValuePos = 0; | 
| 443 | 443 | 
| 444     std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 444     std::unique_ptr<CPDF_Dictionary> pDict(new CPDF_Dictionary(m_pPool)); | 
| 445         new CPDF_Dictionary(m_pPool)); |  | 
| 446     while (1) { | 445     while (1) { | 
| 447       CFX_ByteString key = GetNextWord(nullptr); | 446       CFX_ByteString key = GetNextWord(nullptr); | 
| 448       if (key.IsEmpty()) | 447       if (key.IsEmpty()) | 
| 449         return nullptr; | 448         return nullptr; | 
| 450 | 449 | 
| 451       FX_FILESIZE SavedPos = m_Pos - key.GetLength(); | 450       FX_FILESIZE SavedPos = m_Pos - key.GetLength(); | 
| 452       if (key == ">>") | 451       if (key == ">>") | 
| 453         break; | 452         break; | 
| 454 | 453 | 
| 455       if (key == "endobj") { | 454       if (key == "endobj") { | 
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 539   } | 538   } | 
| 540 | 539 | 
| 541   if (word == "<") { | 540   if (word == "<") { | 
| 542     CFX_ByteString str = ReadHexString(); | 541     CFX_ByteString str = ReadHexString(); | 
| 543     if (m_pCryptoHandler) | 542     if (m_pCryptoHandler) | 
| 544       m_pCryptoHandler->Decrypt(objnum, gennum, str); | 543       m_pCryptoHandler->Decrypt(objnum, gennum, str); | 
| 545     return new CPDF_String(MaybeIntern(str), true); | 544     return new CPDF_String(MaybeIntern(str), true); | 
| 546   } | 545   } | 
| 547 | 546 | 
| 548   if (word == "[") { | 547   if (word == "[") { | 
| 549     std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray( | 548     std::unique_ptr<CPDF_Array> pArray(new CPDF_Array); | 
| 550         new CPDF_Array); |  | 
| 551     while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) | 549     while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) | 
| 552       pArray->Add(pObj); | 550       pArray->Add(pObj); | 
| 553 | 551 | 
| 554     return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; | 552     return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; | 
| 555   } | 553   } | 
| 556 | 554 | 
| 557   if (word[0] == '/') { | 555   if (word[0] == '/') { | 
| 558     return new CPDF_Name(MaybeIntern( | 556     return new CPDF_Name(MaybeIntern( | 
| 559         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); | 557         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); | 
| 560   } | 558   } | 
| 561 | 559 | 
| 562   if (word == "<<") { | 560   if (word == "<<") { | 
| 563     std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 561     std::unique_ptr<CPDF_Dictionary> pDict(new CPDF_Dictionary(m_pPool)); | 
| 564         new CPDF_Dictionary(m_pPool)); |  | 
| 565     while (1) { | 562     while (1) { | 
| 566       FX_FILESIZE SavedPos = m_Pos; | 563       FX_FILESIZE SavedPos = m_Pos; | 
| 567       CFX_ByteString key = GetNextWord(nullptr); | 564       CFX_ByteString key = GetNextWord(nullptr); | 
| 568       if (key.IsEmpty()) | 565       if (key.IsEmpty()) | 
| 569         return nullptr; | 566         return nullptr; | 
| 570 | 567 | 
| 571       if (key == ">>") | 568       if (key == ">>") | 
| 572         break; | 569         break; | 
| 573 | 570 | 
| 574       if (key == "endobj") { | 571       if (key == "endobj") { | 
| 575         m_Pos = SavedPos; | 572         m_Pos = SavedPos; | 
| 576         break; | 573         break; | 
| 577       } | 574       } | 
| 578 | 575 | 
| 579       if (key[0] != '/') | 576       if (key[0] != '/') | 
| 580         continue; | 577         continue; | 
| 581 | 578 | 
| 582       key = PDF_NameDecode(key); | 579       key = PDF_NameDecode(key); | 
| 583       std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> obj( | 580       std::unique_ptr<CPDF_Object> obj( | 
| 584           GetObject(pObjList, objnum, gennum, true)); | 581           GetObject(pObjList, objnum, gennum, true)); | 
| 585       if (!obj) { | 582       if (!obj) { | 
| 586         uint8_t ch; | 583         uint8_t ch; | 
| 587         while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { | 584         while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { | 
| 588           continue; | 585           continue; | 
| 589         } | 586         } | 
| 590         return nullptr; | 587         return nullptr; | 
| 591       } | 588       } | 
| 592 | 589 | 
| 593       if (key.GetLength() > 1) { | 590       if (key.GetLength() > 1) { | 
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 701         // Stop searching when "endobj" is found. | 698         // Stop searching when "endobj" is found. | 
| 702         if (IsWholeWord(m_Pos - kEndObjStr.GetLength(), m_FileLen, kEndObjStr, | 699         if (IsWholeWord(m_Pos - kEndObjStr.GetLength(), m_FileLen, kEndObjStr, | 
| 703                         true)) { | 700                         true)) { | 
| 704           endObjOffset = m_Pos - streamStartPos - kEndObjStr.GetLength(); | 701           endObjOffset = m_Pos - streamStartPos - kEndObjStr.GetLength(); | 
| 705           break; | 702           break; | 
| 706         } | 703         } | 
| 707       } | 704       } | 
| 708 | 705 | 
| 709       // Can't find "endstream" or "endobj". | 706       // Can't find "endstream" or "endobj". | 
| 710       if (endStreamOffset < 0 && endObjOffset < 0) { | 707       if (endStreamOffset < 0 && endObjOffset < 0) { | 
| 711         pDict->Release(); | 708         delete pDict; | 
| 712         return nullptr; | 709         return nullptr; | 
| 713       } | 710       } | 
| 714 | 711 | 
| 715       if (endStreamOffset < 0 && endObjOffset >= 0) { | 712       if (endStreamOffset < 0 && endObjOffset >= 0) { | 
| 716         // Correct the position of end stream. | 713         // Correct the position of end stream. | 
| 717         endStreamOffset = endObjOffset; | 714         endStreamOffset = endObjOffset; | 
| 718       } else if (endStreamOffset >= 0 && endObjOffset < 0) { | 715       } else if (endStreamOffset >= 0 && endObjOffset < 0) { | 
| 719         // Correct the position of end obj. | 716         // Correct the position of end obj. | 
| 720         endObjOffset = endStreamOffset; | 717         endObjOffset = endStreamOffset; | 
| 721       } else if (endStreamOffset > endObjOffset) { | 718       } else if (endStreamOffset > endObjOffset) { | 
| 722         endStreamOffset = endObjOffset; | 719         endStreamOffset = endObjOffset; | 
| 723       } | 720       } | 
| 724 | 721 | 
| 725       len = endStreamOffset; | 722       len = endStreamOffset; | 
| 726       int numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 2); | 723       int numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 2); | 
| 727       if (numMarkers == 2) { | 724       if (numMarkers == 2) { | 
| 728         len -= 2; | 725         len -= 2; | 
| 729       } else { | 726       } else { | 
| 730         numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); | 727         numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); | 
| 731         if (numMarkers == 1) { | 728         if (numMarkers == 1) { | 
| 732           len -= 1; | 729           len -= 1; | 
| 733         } | 730         } | 
| 734       } | 731       } | 
| 735 | 732 | 
| 736       if (len < 0) { | 733       if (len < 0) { | 
| 737         pDict->Release(); | 734         delete pDict; | 
| 738         return nullptr; | 735         return nullptr; | 
| 739       } | 736       } | 
| 740       pDict->SetIntegerFor("Length", len); | 737       pDict->SetIntegerFor("Length", len); | 
| 741     } | 738     } | 
| 742     m_Pos = streamStartPos; | 739     m_Pos = streamStartPos; | 
| 743   } | 740   } | 
| 744 | 741 | 
| 745   if (len < 0) { | 742   if (len < 0) { | 
| 746     pDict->Release(); | 743     delete pDict; | 
| 747     return nullptr; | 744     return nullptr; | 
| 748   } | 745   } | 
| 749 | 746 | 
| 750   uint8_t* pData = nullptr; | 747   uint8_t* pData = nullptr; | 
| 751   if (len > 0) { | 748   if (len > 0) { | 
| 752     pData = FX_Alloc(uint8_t, len); | 749     pData = FX_Alloc(uint8_t, len); | 
| 753     ReadBlock(pData, len); | 750     ReadBlock(pData, len); | 
| 754     if (pCryptoHandler) { | 751     if (pCryptoHandler) { | 
| 755       CFX_BinaryBuf dest_buf; | 752       CFX_BinaryBuf dest_buf; | 
| 756       dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len)); | 753       dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len)); | 
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 988 } | 985 } | 
| 989 | 986 | 
| 990 void CPDF_SyntaxParser::SetEncrypt( | 987 void CPDF_SyntaxParser::SetEncrypt( | 
| 991     std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) { | 988     std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) { | 
| 992   m_pCryptoHandler = std::move(pCryptoHandler); | 989   m_pCryptoHandler = std::move(pCryptoHandler); | 
| 993 } | 990 } | 
| 994 | 991 | 
| 995 CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) { | 992 CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) { | 
| 996   return m_pPool ? m_pPool->Intern(str) : str; | 993   return m_pPool ? m_pPool->Intern(str) : str; | 
| 997 } | 994 } | 
| OLD | NEW | 
|---|