[poppler] CMakeLists.txt cpp/tests INSTALL
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Oct 25 09:35:21 UTC 2018
CMakeLists.txt | 9 ++++++--
INSTALL | 4 +++
cpp/tests/CMakeLists.txt | 10 ++++-----
cpp/tests/pdf_fuzzer.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 65 insertions(+), 7 deletions(-)
New commits:
commit f235a53673abdd6cf6c2f69ba63a64fccb258b36
Author: Adam Reichold <adam.reichold at t-online.de>
Date: Sat Sep 1 11:53:03 2018 +0200
Add fuzzer target from oss-fuzz project and integrate it into the build system via FUZZER CMake variable.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3ad655bf..9c4753e3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,9 +24,15 @@ CHECK_FILE_OFFSET_BITS()
include(GNUInstallDirs)
+set(ENABLE_FUZZER FALSE)
+
find_package (ECM 1.6.0 QUIET NO_MODULE)
if (ECM_FOUND)
include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake")
+
+ if(ECM_ENABLE_SANITIZERS MATCHES fuzzer)
+ set(ENABLE_FUZZER TRUE)
+ endif()
endif()
set(POPPLER_MAJOR_VERSION "0")
@@ -303,12 +309,10 @@ else()
set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS} ${CMAKE_CXX_FLAGS}")
endif()
-
include(ConfigureChecks.cmake)
configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
configure_file(poppler/poppler-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h)
-
set(poppler_SRCS
goo/gfile.cc
goo/GooTimer.cc
@@ -717,6 +721,7 @@ show_end_message_yesno("use curl" ENABLE_LIBCURL)
show_end_message_yesno("use libopenjpeg2" WITH_OPENJPEG)
show_end_message_yesno("use lcms2" USE_CMS)
show_end_message_yesno("command line utils" ENABLE_UTILS)
+show_end_message_yesno("fuzz target" ENABLE_FUZZER)
show_end_message("test data dir" ${TESTDATADIR})
if(NOT ENABLE_SPLASH AND NOT CAIRO_FOUND)
diff --git a/INSTALL b/INSTALL
index a38a8c00..99ac15f7 100644
--- a/INSTALL
+++ b/INSTALL
@@ -102,3 +102,7 @@ package) then use -DECM_ENABLE_SANITIZERS to specify the santizers. eg
Some options may only be available with clang. Use
-DCMAKE_CXX_COMPILER=clang++ to build with clang.
+
+The sanitizer can also be combined with fuzz testing by using Clang 6.0
+or later and additionally enabling the sanitizer fuzzer which
+will enable the fuzz target cpp/tests/pdf_fuzzer.
diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt
index 72c1251a..f5be4213 100644
--- a/cpp/tests/CMakeLists.txt
+++ b/cpp/tests/CMakeLists.txt
@@ -11,15 +11,15 @@ macro(CPP_ADD_SIMPLETEST exe)
${ARGN}
)
poppler_add_test(${exe} BUILD_CPP_TESTS ${${test_name}_SOURCES})
- target_link_libraries(${exe} poppler-cpp)
+ target_link_libraries(${exe} poppler-cpp poppler)
if(MSVC)
target_link_libraries(${exe} poppler ${poppler_LIBS})
endif()
endmacro(CPP_ADD_SIMPLETEST)
-
cpp_add_simpletest(poppler-dump poppler-dump.cpp ${CMAKE_SOURCE_DIR}/utils/parseargs.cc)
-target_link_libraries(poppler-dump poppler)
-
cpp_add_simpletest(poppler-render poppler-render.cpp ${CMAKE_SOURCE_DIR}/utils/parseargs.cc)
-target_link_libraries(poppler-render poppler)
+
+if(ENABLE_FUZZER)
+ cpp_add_simpletest(pdf_fuzzer pdf_fuzzer.cc)
+endif()
diff --git a/cpp/tests/pdf_fuzzer.cc b/cpp/tests/pdf_fuzzer.cc
new file mode 100644
index 00000000..f773557e
--- /dev/null
+++ b/cpp/tests/pdf_fuzzer.cc
@@ -0,0 +1,49 @@
+/*
+# Copyright 2018 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+*/
+
+#include <cstdint>
+
+#include <poppler-global.h>
+#include <poppler-document.h>
+#include <poppler-page.h>
+#include <poppler-page-renderer.h>
+
+static void dummy_error_function(const std::string&, void*) {}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ poppler::set_debug_error_function(dummy_error_function, nullptr);
+
+ poppler::document *doc = poppler::document::load_from_raw_data((const char *)data, size);
+ if (!doc || doc->is_locked()) {
+ delete doc;
+ return 0;
+ }
+
+ poppler::page_renderer r;
+ for (int i = 0; i < doc->pages(); i++) {
+ poppler::page *p = doc->create_page(i);
+ if (!p) {
+ continue;
+ }
+ r.render_page(p);
+ delete p;
+ }
+
+ delete doc;
+ return 0;
+}
More information about the poppler
mailing list