diff options
-rw-r--r-- | core/fpdfapi/parser/cpdf_stream_acc.cpp | 15 | ||||
-rw-r--r-- | core/fpdfapi/parser/fpdf_parser_decode.cpp | 55 | ||||
-rw-r--r-- | core/fpdfapi/parser/fpdf_parser_decode.h | 2 |
3 files changed, 27 insertions, 45 deletions
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp index c87e404186..6516a2ff2c 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.cpp +++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp @@ -115,7 +115,7 @@ void CPDF_StreamAcc::ProcessFilteredData(uint32_t estimated_size, pSrcData = std::move(pTempSrcData); } - uint8_t* pDecodedData = nullptr; + std::unique_ptr<uint8_t, FxFreeDeleter> pDecodedData; uint32_t dwDecodedSize = 0; if (!PDF_DataDecode({pSrcData.Get(), dwSrcSize}, m_pStream->GetDict(), estimated_size, bImageAcc, &pDecodedData, &dwDecodedSize, @@ -125,16 +125,13 @@ void CPDF_StreamAcc::ProcessFilteredData(uint32_t estimated_size, return; } - if (!pDecodedData) - return; - - if (pDecodedData == pSrcData.Get()) { + if (pDecodedData) { + ASSERT(pDecodedData.get() != pSrcData.Get()); + m_pData = std::move(pDecodedData); + m_dwSize = dwDecodedSize; + } else { m_pData = std::move(pSrcData); m_dwSize = dwSrcSize; - } else { - std::unique_ptr<uint8_t, FxFreeDeleter> p(pDecodedData); - m_pData = std::move(p); - m_dwSize = dwDecodedSize; } } diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp index 2f73b3a4cb..a581dcc44f 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode.cpp +++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp @@ -362,17 +362,16 @@ bool PDF_DataDecode(pdfium::span<const uint8_t> src_span, const CPDF_Dictionary* pDict, uint32_t last_estimated_size, bool bImageAcc, - uint8_t** dest_buf, + std::unique_ptr<uint8_t, FxFreeDeleter>* dest_buf, uint32_t* dest_size, ByteString* ImageEncoding, UnownedPtr<const CPDF_Dictionary>* pImageParams) { - const CPDF_Object* pDecoder = - pDict ? pDict->GetDirectObjectFor("Filter") : nullptr; + const CPDF_Object* pDecoder = pDict->GetDirectObjectFor("Filter"); if (!pDecoder || (!pDecoder->IsArray() && !pDecoder->IsName())) return false; const CPDF_Object* pParams = - pDict ? pDict->GetDirectObjectFor(pdfium::stream::kDecodeParms) : nullptr; + pDict->GetDirectObjectFor(pdfium::stream::kDecodeParms); std::vector<std::pair<ByteString, const CPDF_Object*>> DecoderArray; if (const CPDF_Array* pDecoders = pDecoder->AsArray()) { @@ -389,14 +388,15 @@ bool PDF_DataDecode(pdfium::span<const uint8_t> src_span, DecoderArray.push_back( {pDecoder->GetString(), pParams ? pParams->GetDict() : nullptr}); } - pdfium::span<uint8_t> last_span(const_cast<uint8_t*>(src_span.data()), - src_span.size()); + + pdfium::span<const uint8_t> last_span = src_span; + std::unique_ptr<uint8_t, FxFreeDeleter> result; size_t nSize = DecoderArray.size(); for (size_t i = 0; i < nSize; ++i) { int estimated_size = i == nSize - 1 ? last_estimated_size : 0; ByteString decoder = DecoderArray[i].first; const CPDF_Dictionary* pParam = ToDictionary(DecoderArray[i].second); - uint8_t* new_buf = nullptr; + std::unique_ptr<uint8_t, FxFreeDeleter> new_buf; uint32_t new_size = 0xFFFFFFFF; uint32_t offset = FX_INVALID_OFFSET; if (decoder == "Crypt") @@ -404,39 +404,29 @@ bool PDF_DataDecode(pdfium::span<const uint8_t> src_span, if (decoder == "FlateDecode" || decoder == "Fl") { if (bImageAcc && i == nSize - 1) { *ImageEncoding = "FlateDecode"; - *dest_buf = last_span.data(); + *dest_buf = std::move(result); *dest_size = last_span.size(); *pImageParams = pParam; return true; } - std::unique_ptr<uint8_t, FxFreeDeleter> result; offset = FlateOrLZWDecode(false, last_span, pParam, estimated_size, - &result, &new_size); - new_buf = result.release(); + &new_buf, &new_size); } else if (decoder == "LZWDecode" || decoder == "LZW") { - std::unique_ptr<uint8_t, FxFreeDeleter> result; offset = FlateOrLZWDecode(true, last_span, pParam, estimated_size, - &result, &new_size); - new_buf = result.release(); + &new_buf, &new_size); } else if (decoder == "ASCII85Decode" || decoder == "A85") { - std::unique_ptr<uint8_t, FxFreeDeleter> result; - offset = A85Decode(last_span, &result, &new_size); - new_buf = result.release(); + offset = A85Decode(last_span, &new_buf, &new_size); } else if (decoder == "ASCIIHexDecode" || decoder == "AHx") { - std::unique_ptr<uint8_t, FxFreeDeleter> result; - offset = HexDecode(last_span, &result, &new_size); - new_buf = result.release(); + offset = HexDecode(last_span, &new_buf, &new_size); } else if (decoder == "RunLengthDecode" || decoder == "RL") { if (bImageAcc && i == nSize - 1) { *ImageEncoding = "RunLengthDecode"; - *dest_buf = last_span.data(); + *dest_buf = std::move(result); *dest_size = last_span.size(); *pImageParams = pParam; return true; } - std::unique_ptr<uint8_t, FxFreeDeleter> result; - offset = RunLengthDecode(last_span, &result, &new_size); - new_buf = result.release(); + offset = RunLengthDecode(last_span, &new_buf, &new_size); } else { // If we get here, assume it's an image decoder. if (decoder == "DCT") @@ -445,24 +435,19 @@ bool PDF_DataDecode(pdfium::span<const uint8_t> src_span, decoder = "CCITTFaxDecode"; *ImageEncoding = std::move(decoder); *pImageParams = pParam; - *dest_buf = last_span.data(); + *dest_buf = std::move(result); *dest_size = last_span.size(); return true; } - if (last_span.data() != src_span.data()) { - auto* temp = last_span.data(); - last_span = {}; // Spans can't outlive their data. - FX_Free(temp); - } - if (offset == FX_INVALID_OFFSET) { - FX_Free(new_buf); + if (offset == FX_INVALID_OFFSET) return false; - } - last_span = {new_buf, new_size}; + + last_span = {new_buf.get(), new_size}; + result = std::move(new_buf); } ImageEncoding->clear(); *pImageParams = nullptr; - *dest_buf = last_span.data(); + *dest_buf = std::move(result); *dest_size = last_span.size(); return true; } diff --git a/core/fpdfapi/parser/fpdf_parser_decode.h b/core/fpdfapi/parser/fpdf_parser_decode.h index 57ee271656..2b7832fbc2 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode.h +++ b/core/fpdfapi/parser/fpdf_parser_decode.h @@ -73,7 +73,7 @@ bool PDF_DataDecode(pdfium::span<const uint8_t> src_span, const CPDF_Dictionary* pDict, uint32_t estimated_size, bool bImageAcc, - uint8_t** dest_buf, + std::unique_ptr<uint8_t, FxFreeDeleter>* dest_buf, uint32_t* dest_size, ByteString* ImageEncoding, UnownedPtr<const CPDF_Dictionary>* pImageParms); |