diff --git a/fuzz/qpdf_page_fuzzer.cc b/fuzz/qpdf_page_fuzzer.cc index 4dd7ae5..7a8db5d 100644 --- a/fuzz/qpdf_page_fuzzer.cc +++ b/fuzz/qpdf_page_fuzzer.cc @@ -12,8 +12,10 @@ #include #include #include -#include + +#include #include +#include class DiscardContents: public QPDFObjectHandle::ParserCallbacks { @@ -40,13 +42,27 @@ class FuzzHelper void testPages(); void doChecks(); + void + info(std::string const& msg, int pageno = 0) const + { + const std::chrono::duration elapsed{std::chrono::steady_clock::now() - start}; + + std::cerr << elapsed.count() << " info - " << msg; + if (pageno > 0) { + std::cerr << " page " << pageno; + } + std::cerr << '\n'; + } + Buffer input_buffer; Pl_Discard discard; + const std::chrono::time_point start; }; FuzzHelper::FuzzHelper(unsigned char const* data, size_t size) : // We do not modify data, so it is safe to remove the const for Buffer - input_buffer(const_cast(data), size) + input_buffer(const_cast(data), size), + start(std::chrono::steady_clock::now()) { } @@ -67,24 +83,34 @@ FuzzHelper::testPages() // Parse all content streams, and exercise some helpers that // operate on pages. std::shared_ptr q = getQpdf(); + info("getQpdf done"); QPDFPageDocumentHelper pdh(*q); QPDFPageLabelDocumentHelper pldh(*q); QPDFOutlineDocumentHelper odh(*q); QPDFAcroFormDocumentHelper afdh(*q); afdh.generateAppearancesIfNeeded(); + info("generateAppearancesIfNeeded done"); pdh.flattenAnnotations(); + info("flattenAnnotations done"); DiscardContents discard_contents; int pageno = 0; for (auto& page: pdh.getAllPages()) { ++pageno; try { + info("start page", pageno); page.coalesceContentStreams(); + info("coalesceContentStreams done"); page.parseContents(&discard_contents); + info("parseContents done"); page.getImages(); + info("getImages done"); pldh.getLabelForPage(pageno); + info("getLabelForPage done"); QPDFObjectHandle page_obj(page.getObjectHandle()); page_obj.getJSON(JSON::LATEST, true).unparse(); + info("getJSON done"); odh.getOutlinesForPage(page_obj); + info("getOutlinesForPage done"); for (auto& aoh: afdh.getWidgetAnnotationsForPage(page)) { afdh.getFieldForAnnotation(aoh);