Index: core/fpdfapi/page/cpdf_image.cpp |
diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp |
index 66599a82683926e8c689ec3fa68cbeb5e760bc8e..dafca2b764c71ff76761f475a90e67c29ae8b774 100644 |
--- a/core/fpdfapi/page/cpdf_image.cpp |
+++ b/core/fpdfapi/page/cpdf_image.cpp |
@@ -26,6 +26,7 @@ |
#include "core/fpdfapi/render/render_int.h" |
#include "core/fxcodec/fx_codec.h" |
#include "core/fxge/fx_dib.h" |
+#include "third_party/base/numerics/safe_conversions.h" |
#include "third_party/base/ptr_util.h" |
CPDF_Image::CPDF_Image(CPDF_Document* pDoc) : m_pDocument(pDoc) {} |
@@ -86,7 +87,8 @@ void CPDF_Image::ConvertStreamToIndirectObject() { |
m_pDocument->AddIndirectObject(std::move(m_pOwnedStream)); |
} |
-CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { |
+std::unique_ptr<CPDF_Dictionary> CPDF_Image::InitJPEG(uint8_t* pData, |
+ uint32_t size) { |
int32_t width; |
int32_t height; |
int32_t num_comps; |
@@ -97,8 +99,8 @@ CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { |
return nullptr; |
} |
- CPDF_Dictionary* pDict = |
- new CPDF_Dictionary(m_pDocument->GetByteStringPool()); |
+ auto pDict = |
+ pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); |
pDict->SetNewFor<CPDF_Name>("Type", "XObject"); |
pDict->SetNewFor<CPDF_Name>("Subtype", "Image"); |
pDict->SetNewFor<CPDF_Number>("Width", width); |
@@ -134,14 +136,17 @@ CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { |
} |
void CPDF_Image::SetJpegImage(IFX_SeekableReadStream* pFile) { |
- uint32_t size = (uint32_t)pFile->GetSize(); |
+ uint32_t size = pdfium::base::checked_cast<uint32_t>(pFile->GetSize()); |
if (!size) |
return; |
uint32_t dwEstimateSize = std::min(size, 8192U); |
std::vector<uint8_t> data(dwEstimateSize); |
- pFile->ReadBlock(data.data(), 0, dwEstimateSize); |
- CPDF_Dictionary* pDict = InitJPEG(data.data(), dwEstimateSize); |
+ if (!pFile->ReadBlock(data.data(), 0, dwEstimateSize)) |
+ return; |
+ |
+ std::unique_ptr<CPDF_Dictionary> pDict = |
+ InitJPEG(data.data(), dwEstimateSize); |
if (!pDict && size > dwEstimateSize) { |
data.resize(size); |
pFile->ReadBlock(data.data(), 0, size); |
@@ -150,7 +155,7 @@ void CPDF_Image::SetJpegImage(IFX_SeekableReadStream* pFile) { |
if (!pDict) |
return; |
- m_pStream->InitStreamFromFile(pFile, pdfium::WrapUnique(pDict)); |
+ m_pStream->InitStreamFromFile(pFile, std::move(pDict)); |
} |
void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap) { |