aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortsdgeos <aacid@kde.org>2019-04-17 00:40:48 +0200
committerMax Moroz <dor3s1@gmail.com>2019-04-16 15:40:48 -0700
commit0221e8b0307c3f069e248082ef99ae2d6fa5a7cb (patch)
treef159857fee704ee30ccb81aacaaefe0108122649
parent53c09d30f60f4b65eaab9d622f3f47938aa7bd4a (diff)
downloadoss-fuzz-0221e8b0307c3f069e248082ef99ae2d6fa5a7cb.tar.gz
[kimageformats] Split fuzzer into 9 fuzzers (#2327)
oss-fuzz devels say this is optimal
-rw-r--r--projects/kimageformats/build.sh22
-rw-r--r--projects/kimageformats/kimgio_fuzzer.cc33
2 files changed, 31 insertions, 24 deletions
diff --git a/projects/kimageformats/build.sh b/projects/kimageformats/build.sh
index d71bed0b7..e0b7f2088 100644
--- a/projects/kimageformats/build.sh
+++ b/projects/kimageformats/build.sh
@@ -32,6 +32,24 @@ cd karchive
cmake . -DBUILD_SHARED_LIBS=OFF -DQt5Core_DIR=$SRC/qtbase/lib/cmake/Qt5Core/ -DBUILD_TESTING=OFF
make install -j$(nproc)
-$CXX $CXXFLAGS -fPIC -std=c++11 $SRC/kimgio_fuzzer.cc $SRC/kimageformats/src/imageformats/kra.cpp $SRC/kimageformats/src/imageformats/ora.cpp $SRC/kimageformats/src/imageformats/pcx.cpp $SRC/kimageformats/src/imageformats/pic.cpp $SRC/kimageformats/src/imageformats/psd.cpp $SRC/kimageformats/src/imageformats/ras.cpp $SRC/kimageformats/src/imageformats/rgb.cpp $SRC/kimageformats/src/imageformats/tga.cpp $SRC/kimageformats/src/imageformats/xcf.cpp -o $OUT/kimgio_fuzzer -I $SRC/qtbase/include/QtCore/ -I $SRC/qtbase/include/ -I $SRC/qtbase/include//QtGui -I $SRC/kimageformats/src/imageformats/ -I $SRC/karchive/src/ -I $SRC/qtbase/mkspecs/linux-clang-libc++/ -L $SRC/qtbase/lib -lQt5Gui -lQt5Core -lqtlibpng -lqtharfbuzz -lm -lqtpcre2 -ldl -lpthread -lFuzzingEngine /usr/local/lib/libzip.a /usr/local/lib/libz.a -lKF5Archive
+cd $SRC
+cd kimageformats
+HANDLER_TYPES="KraHandler kra
+ OraHandler ora
+ PCXHandler pcx
+ SoftimagePICHandler pic
+ PSDHandler psd
+ RASHandler ras
+ RGBHandler rgb
+ TGAHandler tga
+ XCFHandler xcf"
+
+echo "$HANDLER_TYPES" | while read class format; do
+(
+ fuzz_target_name=kimgio_${format}_fuzzer
+
+ $CXX $CXXFLAGS -fPIC -DHANDLER=$class -std=c++11 $SRC/kimgio_fuzzer.cc $SRC/kimageformats/src/imageformats/$format.cpp -o $OUT/$fuzz_target_name -I $SRC/qtbase/include/QtCore/ -I $SRC/qtbase/include/ -I $SRC/qtbase/include//QtGui -I $SRC/kimageformats/src/imageformats/ -I $SRC/karchive/src/ -I $SRC/qtbase/mkspecs/linux-clang-libc++/ -L $SRC/qtbase/lib -lQt5Gui -lQt5Core -lqtlibpng -lqtharfbuzz -lm -lqtpcre2 -ldl -lpthread -lFuzzingEngine /usr/local/lib/libzip.a /usr/local/lib/libz.a -lKF5Archive
-zip -qr $OUT/kimgio_fuzzer_seed_corpus.zip $SRC/kimageformats/autotests/read/ $SRC/kimageformats/autotests/write/ $SRC/kimageformats/autotests/pic/
+ find . -name "*.${format}" | zip -q $OUT/${fuzz_target_name}_seed_corpus.zip -@
+)
+done
diff --git a/projects/kimageformats/kimgio_fuzzer.cc b/projects/kimageformats/kimgio_fuzzer.cc
index ca74dc1a3..7a17076c8 100644
--- a/projects/kimageformats/kimgio_fuzzer.cc
+++ b/projects/kimageformats/kimgio_fuzzer.cc
@@ -20,7 +20,7 @@
Usage:
python infra/helper.py build_image kimageformats
python infra/helper.py build_fuzzers --sanitizer undefined|address|memory kimageformats
- python infra/helper.py run_fuzzer kimageformats kimgio_fuzzer
+ python infra/helper.py run_fuzzer kimageformats kimgio_[kra|ora|pcx|pic|psd|ras|rgb|tga|xcf]_fuzzer
*/
@@ -43,28 +43,17 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
int argc = 0;
QCoreApplication a(argc, nullptr);
- const QVector<QImageIOHandler*> handlers = {
- new KraHandler(),
- new OraHandler(),
- new PCXHandler(),
- new SoftimagePICHandler(),
- new PSDHandler(),
- new RASHandler(),
- new RGBHandler(),
- new TGAHandler(),
- new XCFHandler()
- };
+ QImageIOHandler* handler = new HANDLER();
- for (QImageIOHandler *h : handlers) {
- QImage i;
- QBuffer b;
- b.setData((const char *)data, size);
- b.open(QIODevice::ReadOnly);
- h->setDevice(&b);
- h->canRead();
- h->read(&i);
- }
- qDeleteAll(handlers);
+ QImage i;
+ QBuffer b;
+ b.setData((const char *)data, size);
+ b.open(QIODevice::ReadOnly);
+ handler->setDevice(&b);
+ handler->canRead();
+ handler->read(&i);
+
+ delete handler;
return 0;
}