From bf786f4cc6f4d6b9dd3b63c6b8030a34b3409366 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sun, 11 Jul 2021 21:14:08 +0100 Subject: [PATCH] Updates to make fuzzing work. --- CMakeLists.txt | 2 +- cmake/compilerFlags.cmake | 4 +++- fuzz/CMakeLists.txt | 2 +- fuzz/read-metadata.cpp | 21 +++++++++++++-------- src/iptc.cpp | 4 ++-- src/jpgimage.cpp | 2 +- src/tiffvisitor_int.cpp | 2 ++ 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4f0093d..474c6d4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,7 +92,7 @@ if( EXIV2_BUILD_UNIT_TESTS ) add_subdirectory ( unitTests ) endif() -if( EXIV2_BUILD_FUZZ_TESTS) +if( EXIV2_BUILD_FUZZ_TESTS ) if ((NOT COMPILER_IS_CLANG) OR (NOT EXIV2_TEAM_USE_SANITIZERS)) message(FATAL_ERROR "You need to build with Clang and sanitizers for the fuzzers to work. " "Use Clang and -DEXIV2_TEAM_USE_SANITIZERS=ON") diff --git a/cmake/compilerFlags.cmake b/cmake/compilerFlags.cmake index 20f6ac53..8459fa0e 100644 --- a/cmake/compilerFlags.cmake +++ b/cmake/compilerFlags.cmake @@ -82,7 +82,9 @@ if ( MINGW OR UNIX OR MSYS ) # MINGW, Linux, APPLE, CYGWIN set(SANITIZER_FLAGS "-fno-omit-frame-pointer -fsanitize=address") endif() elseif( COMPILER_IS_CLANG ) - if ( CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 ) + if ( EXIV2_BUILD_FUZZ_TESTS ) + set(SANITIZER_FLAGS "-fsanitize=fuzzer-no-link") + elseif ( CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 ) set(SANITIZER_FLAGS "-fno-omit-frame-pointer -fsanitize=address,undefined -fno-sanitize-recover=all") elseif ( CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3.4 ) set(SANITIZER_FLAGS "-fno-omit-frame-pointer -fsanitize=address,undefined") diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index 281ff570..86209e9c 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -11,4 +11,4 @@ macro(fuzzer name) ) endmacro() -fuzzer(read-metadata) \ No newline at end of file +fuzzer(read-metadata) diff --git a/fuzz/read-metadata.cpp b/fuzz/read-metadata.cpp index 9f0b5979..088b3ef8 100644 --- a/fuzz/read-metadata.cpp +++ b/fuzz/read-metadata.cpp @@ -4,21 +4,26 @@ #include #include +extern "C" int LLVMFuzzerTestOneInput(const uint8_t * Data, size_t Size) { + // Invalid files generate a lot of warnings, so switch off logging. + Exiv2::LogMsg::setLevel(Exiv2::LogMsg::mute); -extern "C" int LLVMFuzzerTestOneInput(const uint8_t * Data, size_t Size) -try { + Exiv2::XmpParser::initialize(); + ::atexit(Exiv2::XmpParser::terminate); + + try { Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open(Data, Size); assert(image.get() != 0); + image->readMetadata(); Exiv2::ExifData &exifData = image->exifData(); if (exifData.empty()) { - return -1; + return -1; } + } catch(...) { + // Exiv2 throws an exception if the metadata is invalid. + } - - return 0; -} -catch (Exiv2::Error& e) { - return -1; + return 0; } diff --git a/src/iptc.cpp b/src/iptc.cpp index 9ae64d81..4252a988 100644 --- a/src/iptc.cpp +++ b/src/iptc.cpp @@ -474,13 +474,13 @@ namespace Exiv2 { #endif } } -#ifndef SUPPRESS_WARNINGS else { +#ifndef SUPPRESS_WARNINGS EXV_WARNING << "IPTC dataset " << IptcKey(dataSet, record) << " has invalid size " << sizeData << "; skipped.\n"; +#endif return 7; } -#endif pRead += sizeData; } diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp index e722a797..6e6f0f96 100644 --- a/src/jpgimage.cpp +++ b/src/jpgimage.cpp @@ -181,7 +181,7 @@ namespace Exiv2 { #endif return -2; } -#ifndef EXIV2_DEBUG_MESSAGES +#ifdef EXIV2_DEBUG_MESSAGES if ( (dataSize & 1) && position + dataSize == static_cast(sizePsData)) { std::cerr << "Warning: " diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index 063cd250..ccf12a4d 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -1335,7 +1335,9 @@ namespace Exiv2 { tc->setStart(p); object->addChild(std::move(tc)); } else { +#ifndef SUPPRESS_WARNINGS EXV_WARNING << "Unable to handle tag " << tag << ".\n"; +#endif } p += 12; }