Get rid of CCodec_ModuleMgr::GetJpxModule().
The CCodec_JpxModule class consists of a set of methods that can all be
static. Make the methods static, and make sure CCodec_JpxModule cannot
be instantiated. Then CCodec_ModuleMgr::GetJpxModule() becomes pointless
and all the callers can just call CCodec_JpxModule directly.
Along the way, get rid of CCodec_JpxModule methods that just forward to
CJPX_Decoder methods. Then JpxBitMapContext can also go away.
Change-Id: Icd424171159dc52b89565dc817e2e4b97e756470
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55050
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/cpdf_modulemgr.cpp b/core/fpdfapi/cpdf_modulemgr.cpp
index fb2194e..83d097a 100644
--- a/core/fpdfapi/cpdf_modulemgr.cpp
+++ b/core/fpdfapi/cpdf_modulemgr.cpp
@@ -64,10 +64,6 @@
return m_pCodecModule->GetJpegModule();
}
-CCodec_JpxModule* CPDF_ModuleMgr::GetJpxModule() {
- return m_pCodecModule->GetJpxModule();
-}
-
CCodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module() {
return m_pCodecModule->GetJbig2Module();
}
diff --git a/core/fpdfapi/cpdf_modulemgr.h b/core/fpdfapi/cpdf_modulemgr.h
index d94bce5..6694f82 100644
--- a/core/fpdfapi/cpdf_modulemgr.h
+++ b/core/fpdfapi/cpdf_modulemgr.h
@@ -14,7 +14,6 @@
class CCodec_IccModule;
class CCodec_Jbig2Module;
class CCodec_JpegModule;
-class CCodec_JpxModule;
class CCodec_ModuleMgr;
class CPDF_PageModule;
@@ -52,7 +51,6 @@
CPDF_PageModule* GetPageModule() const { return m_pPageModule.get(); }
CCodec_JpegModule* GetJpegModule();
- CCodec_JpxModule* GetJpxModule();
CCodec_Jbig2Module* GetJbig2Module();
CCodec_IccModule* GetIccModule();
CCodec_FlateModule* GetFlateModule();
diff --git a/core/fpdfapi/render/cpdf_dibbase.cpp b/core/fpdfapi/render/cpdf_dibbase.cpp
index 6fc101d..696cad5 100644
--- a/core/fpdfapi/render/cpdf_dibbase.cpp
+++ b/core/fpdfapi/render/cpdf_dibbase.cpp
@@ -84,29 +84,6 @@
return false;
}
-// Wrapper class to use with std::unique_ptr for CJPX_Decoder.
-class JpxBitMapContext {
- public:
- explicit JpxBitMapContext(CCodec_JpxModule* jpx_module)
- : jpx_module_(jpx_module), decoder_(nullptr) {}
-
- ~JpxBitMapContext() {}
-
- void set_decoder(std::unique_ptr<CJPX_Decoder> decoder) {
- decoder_ = std::move(decoder);
- }
-
- CJPX_Decoder* decoder() { return decoder_.get(); }
-
- private:
- CCodec_JpxModule* const jpx_module_; // Weak pointer.
- std::unique_ptr<CJPX_Decoder> decoder_;
-
- // Disallow evil constructors
- JpxBitMapContext(const JpxBitMapContext&);
- void operator=(const JpxBitMapContext&);
-};
-
} // namespace
CPDF_DIBBase::CPDF_DIBBase() = default;
@@ -584,20 +561,18 @@
}
RetainPtr<CFX_DIBitmap> CPDF_DIBBase::LoadJpxBitmap() {
- CCodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();
- auto context = pdfium::MakeUnique<JpxBitMapContext>(pJpxModule);
- context->set_decoder(
- pJpxModule->CreateDecoder(m_pStreamAcc->GetSpan(), m_pColorSpace));
- if (!context->decoder())
+ std::unique_ptr<CJPX_Decoder> decoder =
+ CCodec_JpxModule::CreateDecoder(m_pStreamAcc->GetSpan(), m_pColorSpace);
+ if (!decoder)
return nullptr;
- if (!context->decoder()->StartDecode())
+ if (!decoder->StartDecode())
return nullptr;
uint32_t width = 0;
uint32_t height = 0;
uint32_t components = 0;
- pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components);
+ decoder->GetInfo(&width, &height, &components);
if (static_cast<int>(width) < m_Width || static_cast<int>(height) < m_Height)
return nullptr;
@@ -643,8 +618,8 @@
output_offsets[0] = 2;
output_offsets[2] = 0;
}
- if (!pJpxModule->Decode(context->decoder(), pCachedBitmap->GetBuffer(),
- pCachedBitmap->GetPitch(), output_offsets)) {
+ if (!decoder->Decode(pCachedBitmap->GetBuffer(), pCachedBitmap->GetPitch(),
+ output_offsets)) {
return nullptr;
}
diff --git a/core/fxcodec/codec/ccodec_jpxmodule.cpp b/core/fxcodec/codec/ccodec_jpxmodule.cpp
index 896754c..004e298 100644
--- a/core/fxcodec/codec/ccodec_jpxmodule.cpp
+++ b/core/fxcodec/codec/ccodec_jpxmodule.cpp
@@ -650,10 +650,7 @@
return true;
}
-CCodec_JpxModule::CCodec_JpxModule() {}
-
-CCodec_JpxModule::~CCodec_JpxModule() {}
-
+// static
std::unique_ptr<CJPX_Decoder> CCodec_JpxModule::CreateDecoder(
pdfium::span<const uint8_t> src_span,
const RetainPtr<CPDF_ColorSpace>& cs) {
@@ -663,17 +660,3 @@
return decoder;
}
-
-void CCodec_JpxModule::GetImageInfo(CJPX_Decoder* pDecoder,
- uint32_t* width,
- uint32_t* height,
- uint32_t* components) {
- pDecoder->GetInfo(width, height, components);
-}
-
-bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder,
- uint8_t* dest_data,
- uint32_t pitch,
- const std::vector<uint8_t>& offsets) {
- return pDecoder->Decode(dest_data, pitch, offsets);
-}
diff --git a/core/fxcodec/codec/ccodec_jpxmodule.h b/core/fxcodec/codec/ccodec_jpxmodule.h
index fd4bd64..7d02c69 100644
--- a/core/fxcodec/codec/ccodec_jpxmodule.h
+++ b/core/fxcodec/codec/ccodec_jpxmodule.h
@@ -19,21 +19,13 @@
class CCodec_JpxModule {
public:
- CCodec_JpxModule();
- ~CCodec_JpxModule();
-
- std::unique_ptr<CJPX_Decoder> CreateDecoder(
+ static std::unique_ptr<CJPX_Decoder> CreateDecoder(
pdfium::span<const uint8_t> src_span,
const RetainPtr<CPDF_ColorSpace>& cs);
- void GetImageInfo(CJPX_Decoder* pDecoder,
- uint32_t* width,
- uint32_t* height,
- uint32_t* components);
- bool Decode(CJPX_Decoder* pDecoder,
- uint8_t* dest_data,
- uint32_t pitch,
- const std::vector<uint8_t>& offsets);
+ CCodec_JpxModule() = delete;
+ CCodec_JpxModule(const CCodec_JpxModule&) = delete;
+ CCodec_JpxModule& operator=(const CCodec_JpxModule&) = delete;
};
#endif // CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_
diff --git a/core/fxcodec/codec/fx_codec.cpp b/core/fxcodec/codec/fx_codec.cpp
index 37f7a7d..f008ce1 100644
--- a/core/fxcodec/codec/fx_codec.cpp
+++ b/core/fxcodec/codec/fx_codec.cpp
@@ -14,7 +14,6 @@
#include "core/fxcodec/codec/ccodec_iccmodule.h"
#include "core/fxcodec/codec/ccodec_jbig2module.h"
#include "core/fxcodec/codec/ccodec_jpegmodule.h"
-#include "core/fxcodec/codec/ccodec_jpxmodule.h"
#include "core/fxcodec/codec/codec_int.h"
#include "core/fxcrt/fx_extension.h"
#include "core/fxcrt/fx_safe_types.h"
@@ -23,7 +22,6 @@
CCodec_ModuleMgr::CCodec_ModuleMgr()
: m_pJpegModule(pdfium::MakeUnique<CCodec_JpegModule>()),
- m_pJpxModule(pdfium::MakeUnique<CCodec_JpxModule>()),
m_pJbig2Module(pdfium::MakeUnique<CCodec_Jbig2Module>()),
m_pIccModule(pdfium::MakeUnique<CCodec_IccModule>()) {}
diff --git a/core/fxcodec/fx_codec.h b/core/fxcodec/fx_codec.h
index e72ac19..6b95258 100644
--- a/core/fxcodec/fx_codec.h
+++ b/core/fxcodec/fx_codec.h
@@ -37,7 +37,6 @@
class CCodec_IccModule;
class CCodec_Jbig2Module;
class CCodec_JpegModule;
-class CCodec_JpxModule;
#ifdef PDF_ENABLE_XFA
class CCodec_ProgressiveDecoder;
@@ -60,7 +59,6 @@
~CCodec_ModuleMgr();
CCodec_JpegModule* GetJpegModule() const { return m_pJpegModule.get(); }
- CCodec_JpxModule* GetJpxModule() const { return m_pJpxModule.get(); }
CCodec_Jbig2Module* GetJbig2Module() const { return m_pJbig2Module.get(); }
CCodec_IccModule* GetIccModule() const { return m_pIccModule.get(); }
@@ -98,7 +96,6 @@
protected:
std::unique_ptr<CCodec_JpegModule> m_pJpegModule;
- std::unique_ptr<CCodec_JpxModule> m_pJpxModule;
std::unique_ptr<CCodec_Jbig2Module> m_pJbig2Module;
std::unique_ptr<CCodec_IccModule> m_pIccModule;
diff --git a/testing/fuzzers/pdf_jpx_fuzzer.cc b/testing/fuzzers/pdf_jpx_fuzzer.cc
index 8a9c63f..6cf3320 100644
--- a/testing/fuzzers/pdf_jpx_fuzzer.cc
+++ b/testing/fuzzers/pdf_jpx_fuzzer.cc
@@ -13,9 +13,8 @@
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/fx_dib.h"
-CCodec_JpxModule g_module;
-
namespace {
+
const uint32_t kMaxJPXFuzzSize = 100 * 1024 * 1024; // 100 MB
bool CheckImageSize(uint32_t width, uint32_t height, uint32_t components) {
@@ -25,11 +24,12 @@
mem *= components;
return mem.IsValid() && mem.ValueOrDie() <= kMemLimitBytes;
}
+
} // namespace
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
std::unique_ptr<CJPX_Decoder> decoder =
- g_module.CreateDecoder({data, size}, nullptr);
+ CCodec_JpxModule::CreateDecoder({data, size}, nullptr);
if (!decoder)
return 0;
@@ -38,7 +38,7 @@
uint32_t width;
uint32_t height;
uint32_t components;
- g_module.GetImageInfo(decoder.get(), &width, &height, &components);
+ decoder->GetInfo(&width, &height, &components);
if (!CheckImageSize(width, height, components))
return 0;
@@ -46,7 +46,7 @@
return 0;
// StartDecode() could change image size, so check again.
- g_module.GetImageInfo(decoder.get(), &width, &height, &components);
+ decoder->GetInfo(&width, &height, &components);
if (!CheckImageSize(width, height, components))
return 0;
@@ -74,7 +74,6 @@
for (uint32_t i = 0; i < components; ++i)
output_offsets[i] = i;
- g_module.Decode(decoder.get(), bitmap->GetBuffer(), bitmap->GetPitch(),
- output_offsets);
+ decoder->Decode(bitmap->GetBuffer(), bitmap->GetPitch(), output_offsets);
return 0;
}