diff options
Diffstat (limited to 'testing')
-rw-r--r-- | testing/fx_string_testhelpers.h | 50 | ||||
-rw-r--r-- | testing/libfuzzer/xfa_codec_fuzzer.h | 29 |
2 files changed, 52 insertions, 27 deletions
diff --git a/testing/fx_string_testhelpers.h b/testing/fx_string_testhelpers.h index 34ac69dab4..5a269a3cf6 100644 --- a/testing/fx_string_testhelpers.h +++ b/testing/fx_string_testhelpers.h @@ -8,8 +8,58 @@ #include <ostream> #include "core/fxcrt/cfx_datetime.h" +#include "core/fxcrt/fx_stream.h" // Output stream operator so GTEST macros work with CFX_DateTime objects. std::ostream& operator<<(std::ostream& os, const CFX_DateTime& dt); +class CFX_InvalidSeekableReadStream : public IFX_SeekableReadStream { + public: + template <typename T, typename... Args> + friend RetainPtr<T> pdfium::MakeRetain(Args&&... args); + + // IFX_SeekableReadStream overrides: + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { + return false; + } + FX_FILESIZE GetSize() override { return data_size_; } + + private: + explicit CFX_InvalidSeekableReadStream(FX_FILESIZE data_size) + : data_size_(data_size) {} + + FX_FILESIZE data_size_; +}; + +class CFX_BufferSeekableReadStream : public IFX_SeekableReadStream { + public: + template <typename T, typename... Args> + friend RetainPtr<T> pdfium::MakeRetain(Args&&... args); + + // IFX_SeekableReadStream: + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { + if (offset < 0 || static_cast<size_t>(offset) >= data_size_) + return false; + + if (static_cast<size_t>(offset) + size > data_size_) + size = data_size_ - static_cast<size_t>(offset); + if (size == 0) + return false; + + memcpy(buffer, data_ + offset, size); + return true; + } + + FX_FILESIZE GetSize() override { + return static_cast<FX_FILESIZE>(data_size_); + } + + private: + CFX_BufferSeekableReadStream(const unsigned char* src, size_t src_size) + : data_(src), data_size_(src_size) {} + + const unsigned char* data_; + size_t data_size_; +}; + #endif // TESTING_FX_STRING_TESTHELPERS_H_ diff --git a/testing/libfuzzer/xfa_codec_fuzzer.h b/testing/libfuzzer/xfa_codec_fuzzer.h index 5193a8930f..a590596dcf 100644 --- a/testing/libfuzzer/xfa_codec_fuzzer.h +++ b/testing/libfuzzer/xfa_codec_fuzzer.h @@ -13,8 +13,8 @@ #include "core/fxcodec/codec/ccodec_progressivedecoder.h" #include "core/fxcodec/codec/ccodec_tiffmodule.h" #include "core/fxcodec/fx_codec.h" -#include "core/fxcrt/fx_stream.h" #include "core/fxge/dib/cfx_dibitmap.h" +#include "testing/fx_string_testhelpers.h" #include "third_party/base/ptr_util.h" class XFACodecFuzzer { @@ -28,7 +28,7 @@ class XFACodecFuzzer { std::unique_ptr<CCodec_ProgressiveDecoder> decoder = mgr->CreateProgressiveDecoder(); - auto source = pdfium::MakeRetain<Reader>(data, size); + auto source = pdfium::MakeRetain<CFX_BufferSeekableReadStream>(data, size); FXCODEC_STATUS status = decoder->LoadImageInfo(source, type, nullptr, true); if (status != FXCODEC_STATUS_FRAME_READY) return 0; @@ -49,31 +49,6 @@ class XFACodecFuzzer { return 0; } - - private: - class Reader : public IFX_SeekableReadStream { - public: - Reader(const uint8_t* data, size_t size) : m_data(data), m_size(size) {} - ~Reader() {} - - bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { - if (offset < 0 || static_cast<size_t>(offset) >= m_size) - return false; - if (offset + size > m_size) - size = m_size - offset; - if (size == 0) - return false; - - memcpy(buffer, m_data + offset, size); - return true; - } - - FX_FILESIZE GetSize() override { return static_cast<FX_FILESIZE>(m_size); } - - private: - const uint8_t* const m_data; - const size_t m_size; - }; }; #endif // TESTING_LIBFUZZER_XFA_CODEC_FUZZER_H_ |