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 |
11 #include "core/fpdfapi/cpdf_modulemgr.h" | 11 #include "core/fpdfapi/cpdf_modulemgr.h" |
12 #include "core/fpdfapi/parser/cpdf_array.h" | 12 #include "core/fpdfapi/parser/cpdf_array.h" |
13 #include "core/fpdfapi/parser/cpdf_boolean.h" | 13 #include "core/fpdfapi/parser/cpdf_boolean.h" |
14 #include "core/fpdfapi/parser/cpdf_crypto_handler.h" | 14 #include "core/fpdfapi/parser/cpdf_crypto_handler.h" |
15 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 15 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
16 #include "core/fpdfapi/parser/cpdf_name.h" | 16 #include "core/fpdfapi/parser/cpdf_name.h" |
17 #include "core/fpdfapi/parser/cpdf_null.h" | 17 #include "core/fpdfapi/parser/cpdf_null.h" |
18 #include "core/fpdfapi/parser/cpdf_number.h" | 18 #include "core/fpdfapi/parser/cpdf_number.h" |
19 #include "core/fpdfapi/parser/cpdf_reference.h" | 19 #include "core/fpdfapi/parser/cpdf_reference.h" |
20 #include "core/fpdfapi/parser/cpdf_stream.h" | 20 #include "core/fpdfapi/parser/cpdf_stream.h" |
21 #include "core/fpdfapi/parser/cpdf_string.h" | 21 #include "core/fpdfapi/parser/cpdf_string.h" |
22 #include "core/fpdfapi/parser/fpdf_parser_decode.h" | 22 #include "core/fpdfapi/parser/fpdf_parser_decode.h" |
23 #include "core/fpdfapi/parser/fpdf_parser_utility.h" | 23 #include "core/fpdfapi/parser/fpdf_parser_utility.h" |
24 #include "core/fxcrt/fx_ext.h" | 24 #include "core/fxcrt/fx_ext.h" |
25 #include "third_party/base/numerics/safe_math.h" | 25 #include "third_party/base/numerics/safe_math.h" |
| 26 #include "third_party/base/ptr_util.h" |
26 | 27 |
27 namespace { | 28 namespace { |
28 | 29 |
29 enum class ReadStatus { Normal, Backslash, Octal, FinishOctal, CarriageReturn }; | 30 enum class ReadStatus { Normal, Backslash, Octal, FinishOctal, CarriageReturn }; |
30 | 31 |
31 } // namespace | 32 } // namespace |
32 | 33 |
33 // static | 34 // static |
34 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; | 35 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; |
35 | 36 |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 | 356 |
356 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { | 357 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { |
357 GetNextWordInternal(bIsNumber); | 358 GetNextWordInternal(bIsNumber); |
358 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); | 359 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); |
359 } | 360 } |
360 | 361 |
361 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { | 362 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { |
362 return GetNextWord(nullptr); | 363 return GetNextWord(nullptr); |
363 } | 364 } |
364 | 365 |
365 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, | 366 std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObject( |
366 uint32_t objnum, | 367 CPDF_IndirectObjectHolder* pObjList, |
367 uint32_t gennum, | 368 uint32_t objnum, |
368 bool bDecrypt) { | 369 uint32_t gennum, |
| 370 bool bDecrypt) { |
369 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); | 371 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
370 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) | 372 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) |
371 return nullptr; | 373 return nullptr; |
372 | 374 |
373 FX_FILESIZE SavedObjPos = m_Pos; | 375 FX_FILESIZE SavedObjPos = m_Pos; |
374 bool bIsNumber; | 376 bool bIsNumber; |
375 CFX_ByteString word = GetNextWord(&bIsNumber); | 377 CFX_ByteString word = GetNextWord(&bIsNumber); |
376 if (word.GetLength() == 0) | 378 if (word.GetLength() == 0) |
377 return nullptr; | 379 return nullptr; |
378 | 380 |
379 if (bIsNumber) { | 381 if (bIsNumber) { |
380 FX_FILESIZE SavedPos = m_Pos; | 382 FX_FILESIZE SavedPos = m_Pos; |
381 CFX_ByteString nextword = GetNextWord(&bIsNumber); | 383 CFX_ByteString nextword = GetNextWord(&bIsNumber); |
382 if (bIsNumber) { | 384 if (bIsNumber) { |
383 CFX_ByteString nextword2 = GetNextWord(nullptr); | 385 CFX_ByteString nextword2 = GetNextWord(nullptr); |
384 if (nextword2 == "R") | 386 if (nextword2 == "R") { |
385 return new CPDF_Reference(pObjList, FXSYS_atoui(word.c_str())); | 387 return pdfium::MakeUnique<CPDF_Reference>(pObjList, |
| 388 FXSYS_atoui(word.c_str())); |
| 389 } |
386 } | 390 } |
387 m_Pos = SavedPos; | 391 m_Pos = SavedPos; |
388 return new CPDF_Number(word.AsStringC()); | 392 return pdfium::MakeUnique<CPDF_Number>(word.AsStringC()); |
389 } | 393 } |
390 | 394 |
391 if (word == "true" || word == "false") | 395 if (word == "true" || word == "false") |
392 return new CPDF_Boolean(word == "true"); | 396 return pdfium::MakeUnique<CPDF_Boolean>(word == "true"); |
393 | 397 |
394 if (word == "null") | 398 if (word == "null") |
395 return new CPDF_Null; | 399 return pdfium::MakeUnique<CPDF_Null>(); |
396 | 400 |
397 if (word == "(") { | 401 if (word == "(") { |
398 CFX_ByteString str = ReadString(); | 402 CFX_ByteString str = ReadString(); |
399 if (m_pCryptoHandler && bDecrypt) | 403 if (m_pCryptoHandler && bDecrypt) |
400 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 404 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
401 return new CPDF_String(MaybeIntern(str), false); | 405 return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), false); |
402 } | 406 } |
403 | |
404 if (word == "<") { | 407 if (word == "<") { |
405 CFX_ByteString str = ReadHexString(); | 408 CFX_ByteString str = ReadHexString(); |
406 if (m_pCryptoHandler && bDecrypt) | 409 if (m_pCryptoHandler && bDecrypt) |
407 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 410 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
408 return new CPDF_String(MaybeIntern(str), true); | 411 return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), true); |
409 } | 412 } |
410 | |
411 if (word == "[") { | 413 if (word == "[") { |
412 CPDF_Array* pArray = new CPDF_Array; | 414 std::unique_ptr<CPDF_Array> pArray = pdfium::MakeUnique<CPDF_Array>(); |
413 while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) | 415 while (std::unique_ptr<CPDF_Object> pObj = |
414 pArray->Add(pObj); | 416 GetObject(pObjList, objnum, gennum, true)) { |
415 | 417 pArray->Add(pObj.release()); |
416 return pArray; | 418 } |
| 419 return std::move(pArray); |
417 } | 420 } |
418 | |
419 if (word[0] == '/') { | 421 if (word[0] == '/') { |
420 return new CPDF_Name(MaybeIntern( | 422 return pdfium::MakeUnique<CPDF_Name>(MaybeIntern( |
421 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); | 423 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); |
422 } | 424 } |
423 | |
424 if (word == "<<") { | 425 if (word == "<<") { |
425 int32_t nKeys = 0; | 426 int32_t nKeys = 0; |
426 FX_FILESIZE dwSignValuePos = 0; | 427 FX_FILESIZE dwSignValuePos = 0; |
427 | 428 std::unique_ptr<CPDF_Dictionary> pDict = |
428 std::unique_ptr<CPDF_Dictionary> pDict(new CPDF_Dictionary(m_pPool)); | 429 pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); |
429 while (1) { | 430 while (1) { |
430 CFX_ByteString key = GetNextWord(nullptr); | 431 CFX_ByteString key = GetNextWord(nullptr); |
431 if (key.IsEmpty()) | 432 if (key.IsEmpty()) |
432 return nullptr; | 433 return nullptr; |
433 | 434 |
434 FX_FILESIZE SavedPos = m_Pos - key.GetLength(); | 435 FX_FILESIZE SavedPos = m_Pos - key.GetLength(); |
435 if (key == ">>") | 436 if (key == ">>") |
436 break; | 437 break; |
437 | 438 |
438 if (key == "endobj") { | 439 if (key == "endobj") { |
439 m_Pos = SavedPos; | 440 m_Pos = SavedPos; |
440 break; | 441 break; |
441 } | 442 } |
442 | |
443 if (key[0] != '/') | 443 if (key[0] != '/') |
444 continue; | 444 continue; |
445 | 445 |
446 ++nKeys; | 446 ++nKeys; |
447 key = PDF_NameDecode(key); | 447 key = PDF_NameDecode(key); |
448 if (key.IsEmpty()) | 448 if (key.IsEmpty()) |
449 continue; | 449 continue; |
450 | 450 |
451 if (key == "/Contents") | 451 if (key == "/Contents") |
452 dwSignValuePos = m_Pos; | 452 dwSignValuePos = m_Pos; |
453 | 453 |
454 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true); | 454 std::unique_ptr<CPDF_Object> pObj = |
| 455 GetObject(pObjList, objnum, gennum, true); |
455 if (!pObj) | 456 if (!pObj) |
456 continue; | 457 continue; |
457 | 458 |
458 CFX_ByteString keyNoSlash(key.raw_str() + 1, key.GetLength() - 1); | 459 CFX_ByteString keyNoSlash(key.raw_str() + 1, key.GetLength() - 1); |
459 pDict->SetFor(keyNoSlash, pObj); | 460 pDict->SetFor(keyNoSlash, pObj.release()); |
460 } | 461 } |
461 | 462 |
462 // Only when this is a signature dictionary and has contents, we reset the | 463 // Only when this is a signature dictionary and has contents, we reset the |
463 // contents to the un-decrypted form. | 464 // contents to the un-decrypted form. |
464 if (pDict->IsSignatureDict() && dwSignValuePos) { | 465 if (pDict->IsSignatureDict() && dwSignValuePos) { |
465 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); | 466 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); |
466 m_Pos = dwSignValuePos; | 467 m_Pos = dwSignValuePos; |
467 pDict->SetFor("Contents", GetObject(pObjList, objnum, gennum, false)); | 468 pDict->SetFor("Contents", |
| 469 GetObject(pObjList, objnum, gennum, false).release()); |
468 } | 470 } |
469 | 471 |
470 FX_FILESIZE SavedPos = m_Pos; | 472 FX_FILESIZE SavedPos = m_Pos; |
471 CFX_ByteString nextword = GetNextWord(nullptr); | 473 CFX_ByteString nextword = GetNextWord(nullptr); |
472 if (nextword != "stream") { | 474 if (nextword != "stream") { |
473 m_Pos = SavedPos; | 475 m_Pos = SavedPos; |
474 return pDict.release(); | 476 return std::move(pDict); |
475 } | 477 } |
476 return ReadStream(pDict.release(), objnum, gennum); | 478 return ReadStream(pDict.release(), objnum, gennum); |
477 } | 479 } |
478 | 480 |
479 if (word == ">>") | 481 if (word == ">>") |
480 m_Pos = SavedObjPos; | 482 m_Pos = SavedObjPos; |
481 | 483 |
482 return nullptr; | 484 return nullptr; |
483 } | 485 } |
484 | 486 |
485 CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( | 487 std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObjectForStrict( |
486 CPDF_IndirectObjectHolder* pObjList, | 488 CPDF_IndirectObjectHolder* pObjList, |
487 uint32_t objnum, | 489 uint32_t objnum, |
488 uint32_t gennum) { | 490 uint32_t gennum) { |
489 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); | 491 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
490 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) | 492 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) |
491 return nullptr; | 493 return nullptr; |
492 | 494 |
493 FX_FILESIZE SavedObjPos = m_Pos; | 495 FX_FILESIZE SavedObjPos = m_Pos; |
494 bool bIsNumber; | 496 bool bIsNumber; |
495 CFX_ByteString word = GetNextWord(&bIsNumber); | 497 CFX_ByteString word = GetNextWord(&bIsNumber); |
496 if (word.GetLength() == 0) | 498 if (word.GetLength() == 0) |
497 return nullptr; | 499 return nullptr; |
498 | 500 |
499 if (bIsNumber) { | 501 if (bIsNumber) { |
500 FX_FILESIZE SavedPos = m_Pos; | 502 FX_FILESIZE SavedPos = m_Pos; |
501 CFX_ByteString nextword = GetNextWord(&bIsNumber); | 503 CFX_ByteString nextword = GetNextWord(&bIsNumber); |
502 if (bIsNumber) { | 504 if (bIsNumber) { |
503 CFX_ByteString nextword2 = GetNextWord(nullptr); | 505 CFX_ByteString nextword2 = GetNextWord(nullptr); |
504 if (nextword2 == "R") | 506 if (nextword2 == "R") { |
505 return new CPDF_Reference(pObjList, FXSYS_atoui(word.c_str())); | 507 return pdfium::MakeUnique<CPDF_Reference>(pObjList, |
| 508 FXSYS_atoui(word.c_str())); |
| 509 } |
506 } | 510 } |
507 m_Pos = SavedPos; | 511 m_Pos = SavedPos; |
508 return new CPDF_Number(word.AsStringC()); | 512 return pdfium::MakeUnique<CPDF_Number>(word.AsStringC()); |
509 } | 513 } |
510 | 514 |
511 if (word == "true" || word == "false") | 515 if (word == "true" || word == "false") |
512 return new CPDF_Boolean(word == "true"); | 516 return pdfium::MakeUnique<CPDF_Boolean>(word == "true"); |
513 | 517 |
514 if (word == "null") | 518 if (word == "null") |
515 return new CPDF_Null; | 519 return pdfium::MakeUnique<CPDF_Null>(); |
516 | 520 |
517 if (word == "(") { | 521 if (word == "(") { |
518 CFX_ByteString str = ReadString(); | 522 CFX_ByteString str = ReadString(); |
519 if (m_pCryptoHandler) | 523 if (m_pCryptoHandler) |
520 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 524 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
521 return new CPDF_String(MaybeIntern(str), false); | 525 return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), false); |
522 } | 526 } |
523 | |
524 if (word == "<") { | 527 if (word == "<") { |
525 CFX_ByteString str = ReadHexString(); | 528 CFX_ByteString str = ReadHexString(); |
526 if (m_pCryptoHandler) | 529 if (m_pCryptoHandler) |
527 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 530 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
528 return new CPDF_String(MaybeIntern(str), true); | 531 return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), true); |
529 } | 532 } |
530 | |
531 if (word == "[") { | 533 if (word == "[") { |
532 std::unique_ptr<CPDF_Array> pArray(new CPDF_Array); | 534 std::unique_ptr<CPDF_Array> pArray = pdfium::MakeUnique<CPDF_Array>(); |
533 while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) | 535 while (std::unique_ptr<CPDF_Object> pObj = |
534 pArray->Add(pObj); | 536 GetObject(pObjList, objnum, gennum, true)) { |
535 | 537 pArray->Add(pObj.release()); |
536 return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; | 538 } |
| 539 return m_WordBuffer[0] == ']' ? std::move(pArray) : nullptr; |
537 } | 540 } |
538 | |
539 if (word[0] == '/') { | 541 if (word[0] == '/') { |
540 return new CPDF_Name(MaybeIntern( | 542 return pdfium::MakeUnique<CPDF_Name>(MaybeIntern( |
541 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); | 543 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); |
542 } | 544 } |
543 | |
544 if (word == "<<") { | 545 if (word == "<<") { |
545 std::unique_ptr<CPDF_Dictionary> pDict(new CPDF_Dictionary(m_pPool)); | 546 std::unique_ptr<CPDF_Dictionary> pDict = |
| 547 pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); |
546 while (1) { | 548 while (1) { |
547 FX_FILESIZE SavedPos = m_Pos; | 549 FX_FILESIZE SavedPos = m_Pos; |
548 CFX_ByteString key = GetNextWord(nullptr); | 550 CFX_ByteString key = GetNextWord(nullptr); |
549 if (key.IsEmpty()) | 551 if (key.IsEmpty()) |
550 return nullptr; | 552 return nullptr; |
551 | 553 |
552 if (key == ">>") | 554 if (key == ">>") |
553 break; | 555 break; |
554 | 556 |
555 if (key == "endobj") { | 557 if (key == "endobj") { |
556 m_Pos = SavedPos; | 558 m_Pos = SavedPos; |
557 break; | 559 break; |
558 } | 560 } |
559 | |
560 if (key[0] != '/') | 561 if (key[0] != '/') |
561 continue; | 562 continue; |
562 | 563 |
563 key = PDF_NameDecode(key); | 564 key = PDF_NameDecode(key); |
564 std::unique_ptr<CPDF_Object> obj( | 565 std::unique_ptr<CPDF_Object> obj( |
565 GetObject(pObjList, objnum, gennum, true)); | 566 GetObject(pObjList, objnum, gennum, true)); |
566 if (!obj) { | 567 if (!obj) { |
567 uint8_t ch; | 568 uint8_t ch; |
568 while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { | 569 while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { |
569 continue; | 570 continue; |
570 } | 571 } |
571 return nullptr; | 572 return nullptr; |
572 } | 573 } |
573 | 574 |
574 if (key.GetLength() > 1) { | 575 if (key.GetLength() > 1) { |
575 pDict->SetFor(CFX_ByteString(key.c_str() + 1, key.GetLength() - 1), | 576 pDict->SetFor(CFX_ByteString(key.c_str() + 1, key.GetLength() - 1), |
576 obj.release()); | 577 obj.release()); |
577 } | 578 } |
578 } | 579 } |
579 | 580 |
580 FX_FILESIZE SavedPos = m_Pos; | 581 FX_FILESIZE SavedPos = m_Pos; |
581 CFX_ByteString nextword = GetNextWord(nullptr); | 582 CFX_ByteString nextword = GetNextWord(nullptr); |
582 if (nextword != "stream") { | 583 if (nextword != "stream") { |
583 m_Pos = SavedPos; | 584 m_Pos = SavedPos; |
584 return pDict.release(); | 585 return std::move(pDict); |
585 } | 586 } |
586 | 587 |
587 return ReadStream(pDict.release(), objnum, gennum); | 588 return ReadStream(pDict.release(), objnum, gennum); |
588 } | 589 } |
589 | 590 |
590 if (word == ">>") | 591 if (word == ">>") |
591 m_Pos = SavedObjPos; | 592 m_Pos = SavedObjPos; |
592 | 593 |
593 return nullptr; | 594 return nullptr; |
594 } | 595 } |
595 | 596 |
596 unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { | 597 unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { |
597 unsigned char byte1 = 0; | 598 unsigned char byte1 = 0; |
598 unsigned char byte2 = 0; | 599 unsigned char byte2 = 0; |
599 | 600 |
600 GetCharAt(pos, byte1); | 601 GetCharAt(pos, byte1); |
601 GetCharAt(pos + 1, byte2); | 602 GetCharAt(pos + 1, byte2); |
602 | 603 |
603 if (byte1 == '\r' && byte2 == '\n') | 604 if (byte1 == '\r' && byte2 == '\n') |
604 return 2; | 605 return 2; |
605 | 606 |
606 if (byte1 == '\r' || byte1 == '\n') | 607 if (byte1 == '\r' || byte1 == '\n') |
607 return 1; | 608 return 1; |
608 | 609 |
609 return 0; | 610 return 0; |
610 } | 611 } |
611 | 612 |
612 CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, | 613 std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( |
613 uint32_t objnum, | 614 CPDF_Dictionary* pDict, |
614 uint32_t gennum) { | 615 uint32_t objnum, |
| 616 uint32_t gennum) { |
615 CPDF_Object* pLenObj = pDict->GetObjectFor("Length"); | 617 CPDF_Object* pLenObj = pDict->GetObjectFor("Length"); |
616 FX_FILESIZE len = -1; | 618 FX_FILESIZE len = -1; |
617 CPDF_Reference* pLenObjRef = ToReference(pLenObj); | 619 CPDF_Reference* pLenObjRef = ToReference(pLenObj); |
618 | 620 |
619 bool differingObjNum = !pLenObjRef || (pLenObjRef->GetObjList() && | 621 bool differingObjNum = !pLenObjRef || (pLenObjRef->GetObjList() && |
620 pLenObjRef->GetRefObjNum() != objnum); | 622 pLenObjRef->GetRefObjNum() != objnum); |
621 if (pLenObj && differingObjNum) | 623 if (pLenObj && differingObjNum) |
622 len = pLenObj->GetInteger(); | 624 len = pLenObj->GetInteger(); |
623 | 625 |
624 // Locate the start of stream. | 626 // Locate the start of stream. |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
740 pCryptoHandler->DecryptStream(context, pData, len, dest_buf); | 742 pCryptoHandler->DecryptStream(context, pData, len, dest_buf); |
741 pCryptoHandler->DecryptFinish(context, dest_buf); | 743 pCryptoHandler->DecryptFinish(context, dest_buf); |
742 | 744 |
743 FX_Free(pData); | 745 FX_Free(pData); |
744 pData = dest_buf.GetBuffer(); | 746 pData = dest_buf.GetBuffer(); |
745 len = dest_buf.GetSize(); | 747 len = dest_buf.GetSize(); |
746 dest_buf.DetachBuffer(); | 748 dest_buf.DetachBuffer(); |
747 } | 749 } |
748 } | 750 } |
749 | 751 |
750 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); | 752 auto pStream = pdfium::MakeUnique<CPDF_Stream>(pData, len, pDict); |
751 streamStartPos = m_Pos; | 753 streamStartPos = m_Pos; |
752 FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); | 754 FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); |
753 | |
754 GetNextWordInternal(nullptr); | 755 GetNextWordInternal(nullptr); |
755 | 756 |
756 int numMarkers = ReadEOLMarkers(m_Pos); | 757 int numMarkers = ReadEOLMarkers(m_Pos); |
757 if (m_WordSize == static_cast<unsigned int>(kEndObjStr.GetLength()) && | 758 if (m_WordSize == static_cast<unsigned int>(kEndObjStr.GetLength()) && |
758 numMarkers != 0 && | 759 numMarkers != 0 && |
759 FXSYS_memcmp(m_WordBuffer, kEndObjStr.raw_str(), | 760 FXSYS_memcmp(m_WordBuffer, kEndObjStr.raw_str(), |
760 kEndObjStr.GetLength()) == 0) { | 761 kEndObjStr.GetLength()) == 0) { |
761 m_Pos = streamStartPos; | 762 m_Pos = streamStartPos; |
762 } | 763 } |
763 return pStream; | 764 return pStream; |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 } | 913 } |
913 | 914 |
914 void CPDF_SyntaxParser::SetEncrypt( | 915 void CPDF_SyntaxParser::SetEncrypt( |
915 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) { | 916 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) { |
916 m_pCryptoHandler = std::move(pCryptoHandler); | 917 m_pCryptoHandler = std::move(pCryptoHandler); |
917 } | 918 } |
918 | 919 |
919 CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) { | 920 CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) { |
920 return m_pPool ? m_pPool->Intern(str) : str; | 921 return m_pPool ? m_pPool->Intern(str) : str; |
921 } | 922 } |
OLD | NEW |