Saner allocation of JBig2_DocumentContext Avoid passing owning uniuqe_ptr as an out parameter. Change-Id: Iedaccd286734d2b6135df5b17439b3bcf2b4eadb Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/77050 Reviewed-by: Hui Yingst <nigi@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp index 6678267..2430183 100644 --- a/core/fpdfapi/page/cpdf_dib.cpp +++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -348,8 +348,8 @@ nGlobalObjNum = m_pGlobalAcc->GetStream()->GetObjNum(); } iDecodeStatus = Jbig2Decoder::StartDecode( - m_pJbig2Context.get(), m_pDocument->CodecContext(), m_Width, m_Height, - pSrcSpan, nSrcObjNum, pGlobalSpan, nGlobalObjNum, + m_pJbig2Context.get(), m_pDocument->GetOrCreateCodecContext(), m_Width, + m_Height, pSrcSpan, nSrcObjNum, pGlobalSpan, nGlobalObjNum, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), pPause); } else { iDecodeStatus = Jbig2Decoder::ContinueDecode(m_pJbig2Context.get(), pPause);
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 62106a7..7ab4f87 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -303,6 +303,12 @@ m_PageList[iPage] = objNum; } +JBig2_DocumentContext* CPDF_Document::GetOrCreateCodecContext() { + if (!m_pCodecContext) + m_pCodecContext = std::make_unique<JBig2_DocumentContext>(); + return m_pCodecContext.get(); +} + int CPDF_Document::GetPageIndex(uint32_t objnum) { uint32_t skip_count = 0; bool bSkipped = false;
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 56168e9..6b1335e 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h
@@ -105,9 +105,7 @@ void SetPageObjNum(int iPage, uint32_t objNum); - std::unique_ptr<JBig2_DocumentContext>* CodecContext() { - return &m_pCodecContext; - } + JBig2_DocumentContext* GetOrCreateCodecContext(); LinkListIface* GetLinksContext() const { return m_pLinksContext.get(); } void SetLinksContext(std::unique_ptr<LinkListIface> pContext) { m_pLinksContext = std::move(pContext);
diff --git a/core/fxcodec/jbig2/jbig2_decoder.cpp b/core/fxcodec/jbig2/jbig2_decoder.cpp index f757195..5896fa8 100644 --- a/core/fxcodec/jbig2/jbig2_decoder.cpp +++ b/core/fxcodec/jbig2/jbig2_decoder.cpp
@@ -31,13 +31,6 @@ } // namespace -JBig2_DocumentContext* GetJBig2DocumentContext( - std::unique_ptr<JBig2_DocumentContext>* pContextHolder) { - if (!*pContextHolder) - *pContextHolder = std::make_unique<JBig2_DocumentContext>(); - return pContextHolder->get(); -} - Jbig2Context::Jbig2Context() = default; Jbig2Context::~Jbig2Context() = default; @@ -45,7 +38,7 @@ // static FXCODEC_STATUS Jbig2Decoder::StartDecode( Jbig2Context* pJbig2Context, - std::unique_ptr<JBig2_DocumentContext>* pContextHolder, + JBig2_DocumentContext* pJBig2DocumentContext, uint32_t width, uint32_t height, pdfium::span<const uint8_t> src_span, @@ -55,10 +48,6 @@ uint8_t* dest_buf, uint32_t dest_pitch, PauseIndicatorIface* pPause) { - ASSERT(pJbig2Context); - - JBig2_DocumentContext* pJBig2DocumentContext = - GetJBig2DocumentContext(pContextHolder); pJbig2Context->m_width = width; pJbig2Context->m_height = height; pJbig2Context->m_pSrcSpan = src_span;
diff --git a/core/fxcodec/jbig2/jbig2_decoder.h b/core/fxcodec/jbig2/jbig2_decoder.h index 97867ca..c5a7ff7 100644 --- a/core/fxcodec/jbig2/jbig2_decoder.h +++ b/core/fxcodec/jbig2/jbig2_decoder.h
@@ -37,18 +37,17 @@ class Jbig2Decoder { public: - static FXCODEC_STATUS StartDecode( - Jbig2Context* pJbig2Context, - std::unique_ptr<JBig2_DocumentContext>* pContextHolder, - uint32_t width, - uint32_t height, - pdfium::span<const uint8_t> src_span, - uint32_t src_objnum, - pdfium::span<const uint8_t> global_span, - uint32_t global_objnum, - uint8_t* dest_buf, - uint32_t dest_pitch, - PauseIndicatorIface* pPause); + static FXCODEC_STATUS StartDecode(Jbig2Context* pJbig2Context, + JBig2_DocumentContext* pDocumentContext, + uint32_t width, + uint32_t height, + pdfium::span<const uint8_t> src_span, + uint32_t src_objnum, + pdfium::span<const uint8_t> global_span, + uint32_t global_objnum, + uint8_t* dest_buf, + uint32_t dest_pitch, + PauseIndicatorIface* pPause); static FXCODEC_STATUS ContinueDecode(Jbig2Context* pJbig2Context, PauseIndicatorIface* pPause);
diff --git a/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc b/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc index 88e288b..000a7b7 100644 --- a/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc +++ b/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc
@@ -35,7 +35,7 @@ return 0; Jbig2Context jbig2_context; - std::unique_ptr<JBig2_DocumentContext> document_context; + JBig2_DocumentContext document_context; FXCODEC_STATUS status = Jbig2Decoder::StartDecode( &jbig2_context, &document_context, width, height, {data, size}, 1, {}, 0, bitmap->GetBuffer(), bitmap->GetPitch(), nullptr);