commit
0208b508a0
@ -0,0 +1,30 @@
|
|||||||
|
# Builds and runs the fuzz target for a short amount of time. This is
|
||||||
|
# mainly to protect the fuzz target from bitrot, but hopefully will
|
||||||
|
# also help to quickly catch some bugs before the PR is merged.
|
||||||
|
|
||||||
|
name: Linux-Ubuntu Quick Fuzz on PRs
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Linux:
|
||||||
|
name: 'Ubuntu 20.04 - clang/libFuzzer'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: install dependencies
|
||||||
|
run: sudo ./ci/install_dependencies.sh
|
||||||
|
- name: build and compile
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake -DEXIV2_ENABLE_PNG=ON -DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_ENABLE_CURL=ON -DEXIV2_ENABLE_BMFF=ON -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON -DCMAKE_CXX_COMPILER=$(which clang++) -DEXIV2_BUILD_FUZZ_TESTS=ON -DEXIV2_TEAM_USE_SANITIZERS=ON ..
|
||||||
|
make -j $(nproc)
|
||||||
|
|
||||||
|
- name: Fuzz
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
mkdir corpus
|
||||||
|
./bin/fuzz-read-print-write corpus ../test/data/ -jobs=$(nproc) -workers=$(nproc) -max_total_time=120 -max_len=4096
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
macro(fuzzer name)
|
||||||
|
add_executable(${name} ${name}.cpp)
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_FLAGS "-fsanitize=fuzzer"
|
||||||
|
LINK_FLAGS "-fsanitize=fuzzer")
|
||||||
|
target_link_libraries(${name}
|
||||||
|
PRIVATE
|
||||||
|
exiv2lib
|
||||||
|
)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
fuzzer(fuzz-read-print-write)
|
@ -0,0 +1,35 @@
|
|||||||
|
#include <exiv2/exiv2.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
Exiv2::XmpParser::initialize();
|
||||||
|
::atexit(Exiv2::XmpParser::terminate);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Exiv2::DataBuf data_copy(data, size);
|
||||||
|
Exiv2::Image::UniquePtr image =
|
||||||
|
Exiv2::ImageFactory::open(data_copy.pData_, size);
|
||||||
|
assert(image.get() != 0);
|
||||||
|
|
||||||
|
image->readMetadata();
|
||||||
|
image->exifData();
|
||||||
|
|
||||||
|
// Print to a std::ostringstream so that the fuzzer doesn't
|
||||||
|
// produce lots of garbage on stdout.
|
||||||
|
std::ostringstream buffer;
|
||||||
|
image->printStructure(buffer, Exiv2::kpsNone);
|
||||||
|
|
||||||
|
image->writeMetadata();
|
||||||
|
|
||||||
|
} catch(...) {
|
||||||
|
// Exiv2 throws an exception if the metadata is invalid.
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue