/src/poppler/cpp/tests/fuzzing/page_search_fuzzer.cc
Line | Count | Source |
1 | | #include <cstdint> |
2 | | #include <poppler-document.h> |
3 | | #include <poppler-global.h> |
4 | | #include "fuzzer_init.h" |
5 | | #include <poppler-page.h> |
6 | | #include <poppler-page-renderer.h> |
7 | | |
8 | | #include "FuzzedDataProvider.h" |
9 | | |
10 | | const size_t input_size = 32; |
11 | | |
12 | 30.2M | static void dummy_error_function(const std::string &, void *) { } |
13 | | |
14 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) |
15 | 16.7k | { |
16 | 16.7k | initialize_poppler_data_dir(); |
17 | 16.7k | if (size < input_size) { |
18 | 0 | return 0; |
19 | 0 | } |
20 | 16.7k | poppler::set_debug_error_function(dummy_error_function, nullptr); |
21 | | |
22 | 16.7k | poppler::document *doc = poppler::document::load_from_raw_data((const char *)data, size); |
23 | 16.7k | if (!doc || doc->is_locked()) { |
24 | 2.29k | delete doc; |
25 | 2.29k | return 0; |
26 | 2.29k | } |
27 | | |
28 | 14.4k | poppler::page_renderer r; |
29 | 14.4k | FuzzedDataProvider data_provider(data, size); |
30 | 14.4k | std::string in_text = data_provider.ConsumeBytesAsString(input_size); |
31 | 140k | for (int i = 0; i < doc->pages(); i++) { |
32 | 125k | poppler::page *p = doc->create_page(i); |
33 | 125k | if (!p) { |
34 | 81.5k | continue; |
35 | 81.5k | } |
36 | 44.3k | poppler::rectf rect = p->page_rect(); |
37 | 44.3k | poppler::ustring text = poppler::ustring::from_utf8(in_text.c_str(), -1); |
38 | 44.3k | p->search(text, rect, poppler::page::search_from_top, poppler::case_insensitive, poppler::rotate_0); |
39 | 44.3k | r.render_page(p); |
40 | 44.3k | delete p; |
41 | 44.3k | } |
42 | | |
43 | 14.4k | delete doc; |
44 | 14.4k | return 0; |
45 | 16.7k | } |