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 <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "../../../include/fpdfapi/fpdf_module.h" | 10 #include "../../../include/fpdfapi/fpdf_module.h" |
(...skipping 2425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2436 } | 2436 } |
2437 if (bTypeOnly) { | 2437 if (bTypeOnly) { |
2438 return (CPDF_Object*)PDFOBJ_INVALID; | 2438 return (CPDF_Object*)PDFOBJ_INVALID; |
2439 } | 2439 } |
2440 return NULL; | 2440 return NULL; |
2441 } | 2441 } |
2442 unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { | 2442 unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { |
2443 unsigned char byte1 = 0; | 2443 unsigned char byte1 = 0; |
2444 unsigned char byte2 = 0; | 2444 unsigned char byte2 = 0; |
2445 GetCharAt(pos, byte1); | 2445 GetCharAt(pos, byte1); |
2446 GetCharAt(pos+1, byte2); | 2446 GetCharAt(pos + 1, byte2); |
2447 unsigned int markers = 0; | 2447 unsigned int markers = 0; |
2448 if (byte1 == '\r' && byte2 == '\n') { | 2448 if (byte1 == '\r' && byte2 == '\n') { |
2449 markers = 2; | 2449 markers = 2; |
2450 } else if (byte1 == '\r' || byte1 == '\n') { | 2450 } else if (byte1 == '\r' || byte1 == '\n') { |
2451 markers = 1; | 2451 markers = 1; |
2452 } | 2452 } |
2453 return markers; | 2453 return markers; |
2454 } | 2454 } |
2455 CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, | 2455 CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
2456 PARSE_CONTEXT* pContext, | 2456 PARSE_CONTEXT* pContext, |
2457 FX_DWORD objnum, | 2457 FX_DWORD objnum, |
2458 FX_DWORD gennum) { | 2458 FX_DWORD gennum) { |
2459 CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length")); | 2459 CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length")); |
2460 FX_FILESIZE len = -1; | 2460 FX_FILESIZE len = -1; |
2461 if (pLenObj && ((pLenObj->GetType() != PDFOBJ_REFERENCE) || | 2461 if (pLenObj && ((pLenObj->GetType() != PDFOBJ_REFERENCE) || |
2462 ((((CPDF_Reference*)pLenObj)->GetObjList()) && | 2462 ((((CPDF_Reference*)pLenObj)->GetObjList()) && |
2463 ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum))) { | 2463 ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum))) { |
2464 len = pLenObj->GetInteger(); | 2464 len = pLenObj->GetInteger(); |
2465 } | 2465 } |
2466 //Check whether end of line markers follow the keyword 'stream'. | 2466 // Check whether end of line markers follow the keyword 'stream'. |
2467 unsigned int numMarkers = ReadEOLMarkers(m_Pos); | 2467 unsigned int numMarkers = ReadEOLMarkers(m_Pos); |
2468 m_Pos += numMarkers; | 2468 m_Pos += numMarkers; |
2469 FX_FILESIZE streamStartPos = m_Pos; | 2469 FX_FILESIZE streamStartPos = m_Pos; |
2470 if (pContext) { | 2470 if (pContext) { |
2471 pContext->m_DataStart = streamStartPos; | 2471 pContext->m_DataStart = streamStartPos; |
2472 } | 2472 } |
2473 const unsigned int ENDSTREAM_LEN = sizeof("endstream") - 1; | 2473 const unsigned int ENDSTREAM_LEN = sizeof("endstream") - 1; |
2474 const unsigned int ENDOBJ_LEN = sizeof("endobj") - 1; | 2474 const unsigned int ENDOBJ_LEN = sizeof("endobj") - 1; |
2475 CPDF_CryptoHandler* pCryptoHandler = objnum == (FX_DWORD)m_MetadataObjnum ? nu
llptr : m_pCryptoHandler; | 2475 CPDF_CryptoHandler* pCryptoHandler = |
| 2476 objnum == (FX_DWORD)m_MetadataObjnum ? nullptr : m_pCryptoHandler; |
2476 if (!pCryptoHandler) { | 2477 if (!pCryptoHandler) { |
2477 FX_BOOL bSearchForKeyword = TRUE; | 2478 FX_BOOL bSearchForKeyword = TRUE; |
2478 unsigned int prevMarkers = 0; | 2479 unsigned int prevMarkers = 0; |
2479 unsigned int nextMarkers = 0; | 2480 unsigned int nextMarkers = 0; |
2480 if (len >= 0) { | 2481 if (len >= 0) { |
2481 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos; | 2482 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos; |
2482 pos += len; | 2483 pos += len; |
2483 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) { | 2484 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) { |
2484 m_Pos = pos.ValueOrDie(); | 2485 m_Pos = pos.ValueOrDie(); |
2485 } | 2486 } |
2486 prevMarkers = ReadEOLMarkers(m_Pos); | 2487 prevMarkers = ReadEOLMarkers(m_Pos); |
2487 GetNextWord(); | 2488 GetNextWord(); |
2488 nextMarkers = ReadEOLMarkers(m_Pos); | 2489 nextMarkers = ReadEOLMarkers(m_Pos); |
2489 if (m_WordSize == ENDSTREAM_LEN && prevMarkers != 0 && nextMarkers != 0 && | 2490 if (m_WordSize == ENDSTREAM_LEN && prevMarkers != 0 && nextMarkers != 0 && |
2490 FXSYS_memcmp(m_WordBuffer, "endstream", ENDSTREAM_LEN) == 0) { | 2491 FXSYS_memcmp(m_WordBuffer, "endstream", ENDSTREAM_LEN) == 0) { |
2491 bSearchForKeyword = FALSE; | 2492 bSearchForKeyword = FALSE; |
2492 } | 2493 } |
2493 } | 2494 } |
2494 if (bSearchForKeyword) { | 2495 if (bSearchForKeyword) { |
2495 //If len is not available, len needs to be calculated | 2496 // If len is not available, len needs to be calculated |
2496 //by searching the keywords "endstream" or "endobj". | 2497 // by searching the keywords "endstream" or "endobj". |
2497 m_Pos = streamStartPos; | 2498 m_Pos = streamStartPos; |
2498 FX_FILESIZE endStreamOffset = 0; | 2499 FX_FILESIZE endStreamOffset = 0; |
2499 while (endStreamOffset >= 0) { | 2500 while (endStreamOffset >= 0) { |
2500 endStreamOffset = FindTag(FX_BSTRC("endstream"), 0); | 2501 endStreamOffset = FindTag(FX_BSTRC("endstream"), 0); |
2501 if (endStreamOffset < 0) { | 2502 if (endStreamOffset < 0) { |
2502 //Can't find any "endstream". | 2503 // Can't find any "endstream". |
2503 break; | 2504 break; |
2504 } | 2505 } |
2505 prevMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); | 2506 prevMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); |
2506 nextMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset + ENDSTREA
M_LEN); | 2507 nextMarkers = |
| 2508 ReadEOLMarkers(streamStartPos + endStreamOffset + ENDSTREAM_LEN); |
2507 if (prevMarkers != 0 && nextMarkers != 0) { | 2509 if (prevMarkers != 0 && nextMarkers != 0) { |
2508 //Stop searching when the keyword "endstream" is found. | 2510 // Stop searching when the keyword "endstream" is found. |
2509 break; | 2511 break; |
2510 } else { | 2512 } else { |
2511 unsigned char ch = 0x00; | 2513 unsigned char ch = 0x00; |
2512 GetCharAt(streamStartPos + endStreamOffset + ENDSTREAM_LEN, ch); | 2514 GetCharAt(streamStartPos + endStreamOffset + ENDSTREAM_LEN, ch); |
2513 if (ch == 0x09 || ch == 0x20) { | 2515 if (ch == 0x09 || ch == 0x20) { |
2514 //"endstream" is treated as a keyword | 2516 //"endstream" is treated as a keyword |
2515 //when it is followed by a tab or whitespace | 2517 // when it is followed by a tab or whitespace |
2516 break; | 2518 break; |
2517 } | 2519 } |
2518 } | 2520 } |
2519 m_Pos += ENDSTREAM_LEN; | 2521 m_Pos += ENDSTREAM_LEN; |
2520 } | 2522 } |
2521 m_Pos = streamStartPos; | 2523 m_Pos = streamStartPos; |
2522 FX_FILESIZE endObjOffset = 0; | 2524 FX_FILESIZE endObjOffset = 0; |
2523 while (endObjOffset >= 0) { | 2525 while (endObjOffset >= 0) { |
2524 endObjOffset = FindTag(FX_BSTRC("endobj"), 0); | 2526 endObjOffset = FindTag(FX_BSTRC("endobj"), 0); |
2525 if (endObjOffset < 0) { | 2527 if (endObjOffset < 0) { |
2526 //Can't find any "endobj". | 2528 // Can't find any "endobj". |
2527 break; | 2529 break; |
2528 } | 2530 } |
2529 prevMarkers = ReadEOLMarkers(streamStartPos + endObjOffset - 1); | 2531 prevMarkers = ReadEOLMarkers(streamStartPos + endObjOffset - 1); |
2530 nextMarkers = ReadEOLMarkers(streamStartPos + endObjOffset + ENDOBJ_LEN)
; | 2532 nextMarkers = |
| 2533 ReadEOLMarkers(streamStartPos + endObjOffset + ENDOBJ_LEN); |
2531 if (prevMarkers != 0 && nextMarkers != 0) { | 2534 if (prevMarkers != 0 && nextMarkers != 0) { |
2532 //Stop searching when the keyword "endobj" is found. | 2535 // Stop searching when the keyword "endobj" is found. |
2533 break; | 2536 break; |
2534 } | 2537 } |
2535 m_Pos += ENDOBJ_LEN; | 2538 m_Pos += ENDOBJ_LEN; |
2536 } | 2539 } |
2537 if (endStreamOffset < 0 && endObjOffset < 0) { | 2540 if (endStreamOffset < 0 && endObjOffset < 0) { |
2538 //Can't find "endstream" or "endobj". | 2541 // Can't find "endstream" or "endobj". |
2539 return nullptr; | 2542 return nullptr; |
2540 } | 2543 } |
2541 if (endStreamOffset < 0 && endObjOffset >= 0) { | 2544 if (endStreamOffset < 0 && endObjOffset >= 0) { |
2542 //Correct the position of end stream. | 2545 // Correct the position of end stream. |
2543 endStreamOffset = endObjOffset; | 2546 endStreamOffset = endObjOffset; |
2544 } else if (endStreamOffset >= 0 && endObjOffset < 0) { | 2547 } else if (endStreamOffset >= 0 && endObjOffset < 0) { |
2545 //Correct the position of end obj. | 2548 // Correct the position of end obj. |
2546 endObjOffset = endStreamOffset; | 2549 endObjOffset = endStreamOffset; |
2547 } else if (endStreamOffset > endObjOffset) { | 2550 } else if (endStreamOffset > endObjOffset) { |
2548 endStreamOffset = endObjOffset; | 2551 endStreamOffset = endObjOffset; |
2549 } | 2552 } |
2550 len = endStreamOffset; | 2553 len = endStreamOffset; |
2551 numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 2); | 2554 numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 2); |
2552 if (numMarkers == 2) { | 2555 if (numMarkers == 2) { |
2553 len -= 2; | 2556 len -= 2; |
2554 } else { | 2557 } else { |
2555 numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); | 2558 numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); |
(...skipping 24 matching lines...) Expand all Loading... |
2580 len = dest_buf.GetSize(); | 2583 len = dest_buf.GetSize(); |
2581 dest_buf.DetachBuffer(); | 2584 dest_buf.DetachBuffer(); |
2582 } | 2585 } |
2583 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); | 2586 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); |
2584 if (pContext) { | 2587 if (pContext) { |
2585 pContext->m_DataEnd = pContext->m_DataStart + len; | 2588 pContext->m_DataEnd = pContext->m_DataStart + len; |
2586 } | 2589 } |
2587 streamStartPos = m_Pos; | 2590 streamStartPos = m_Pos; |
2588 GetNextWord(); | 2591 GetNextWord(); |
2589 numMarkers = ReadEOLMarkers(m_Pos); | 2592 numMarkers = ReadEOLMarkers(m_Pos); |
2590 if (m_WordSize == ENDOBJ_LEN && numMarkers != 0 && | 2593 if (m_WordSize == ENDOBJ_LEN && numMarkers != 0 && |
2591 FXSYS_memcmp(m_WordBuffer, "endobj", ENDOBJ_LEN) == 0) { | 2594 FXSYS_memcmp(m_WordBuffer, "endobj", ENDOBJ_LEN) == 0) { |
2592 m_Pos = streamStartPos; | 2595 m_Pos = streamStartPos; |
2593 } | 2596 } |
2594 return pStream; | 2597 return pStream; |
2595 } | 2598 } |
2596 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, | 2599 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, |
2597 FX_DWORD HeaderOffset) { | 2600 FX_DWORD HeaderOffset) { |
2598 if (m_pFileBuf) { | 2601 if (m_pFileBuf) { |
2599 FX_Free(m_pFileBuf); | 2602 FX_Free(m_pFileBuf); |
2600 m_pFileBuf = NULL; | 2603 m_pFileBuf = NULL; |
2601 } | 2604 } |
(...skipping 2114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4716 return FALSE; | 4719 return FALSE; |
4717 } | 4720 } |
4718 CPDF_PageNode::~CPDF_PageNode() { | 4721 CPDF_PageNode::~CPDF_PageNode() { |
4719 int32_t iSize = m_childNode.GetSize(); | 4722 int32_t iSize = m_childNode.GetSize(); |
4720 for (int32_t i = 0; i < iSize; ++i) { | 4723 for (int32_t i = 0; i < iSize; ++i) { |
4721 CPDF_PageNode* pNode = (CPDF_PageNode*)m_childNode[i]; | 4724 CPDF_PageNode* pNode = (CPDF_PageNode*)m_childNode[i]; |
4722 delete pNode; | 4725 delete pNode; |
4723 } | 4726 } |
4724 m_childNode.RemoveAll(); | 4727 m_childNode.RemoveAll(); |
4725 } | 4728 } |
OLD | NEW |