aboutsummaryrefslogtreecommitdiff
path: root/fuzzer
diff options
context:
space:
mode:
Diffstat (limited to 'fuzzer')
-rw-r--r--fuzzer/README.md82
-rw-r--r--fuzzer/hevc_dec_fuzzer.cmake2
-rw-r--r--fuzzer/hevc_enc_fuzzer.cmake2
-rw-r--r--fuzzer/hevc_enc_fuzzer.cpp1
-rwxr-xr-xfuzzer/ossfuzz.sh19
5 files changed, 43 insertions, 63 deletions
diff --git a/fuzzer/README.md b/fuzzer/README.md
index 49353da..0df4e6e 100644
--- a/fuzzer/README.md
+++ b/fuzzer/README.md
@@ -1,11 +1,11 @@
-# Fuzzer for libhevc decoder
+# Fuzzer for libhevc decoder and encoder
-This describes steps to build hevc_dec_fuzzer binary.
+This describes steps to build hevc_dec_fuzzer and hevc_enc_fuzzer binary.
## Linux x86/x64
### Requirements
-- cmake (3.5 or above)
+- cmake (3.9.1 or above)
- make
- clang (6.0 or above)
needs to support -fsanitize=fuzzer, -fsanitize=fuzzer-no-link
@@ -21,51 +21,62 @@ Create a directory inside libhevc and change directory
$ mkdir build
$ cd build
```
-Build libhevc using cmake
+Build fuzzer with required sanitizers (-DSANITIZE=fuzzer-no-link is mandatory
+ to enable fuzzers)
```
- $ CC=clang CXX=clang++ cmake ../ \
- -DSANITIZE=fuzzer-no-link,address,signed-integer-overflow
+ $ cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
+ -DCMAKE_BUILD_TYPE=Debug -DSANITIZE=fuzzer-no-link,address
$ make
```
-Build the fuzzer
-```
- $ clang++ -std=c++11 -fsanitize=fuzzer,address -I. -I../ -I../common \
- -I../decoder -Wl,--start-group ../fuzzer/hevc_dec_fuzzer.cpp \
- -o ./hevc_dec_fuzzer ./libhevcdec.a -Wl,--end-group
-```
### Steps to run
-Create a directory CORPUS_DIR and copy some elementary hevc files to that folder
-To run the fuzzer
+Create a directory CORPUS_DIR and copy some elementary hevc files
+(for hevc_dec_fuzzer) or yuv files (for hevc_enc_fuzzer) to that directory
+
+To run the fuzzers
```
$ ./hevc_dec_fuzzer CORPUS_DIR
+$ ./hevc_enc_fuzzer CORPUS_DIR
```
## Android
### Steps to build
-Build the fuzzer
+Build the fuzzers
```
- $ SANITIZE_TARGET=address SANITIZE_HOST=address mmma -j$(nproc) \
- external/libhevc/fuzzer
+ $ mm -j$(nproc) hevc_dec_fuzzer
+ $ mm -j$(nproc) hevc_enc_fuzzer
```
### Steps to run
-Create a directory CORPUS_DIR and copy some elementary hevc files to that folder
-Push this directory to device.
+Create a directory CORPUS_DIR and copy some elementary hevc files
+(for hevc_dec_fuzzer) or yuv files (for hevc_enc_fuzzer) to that folder
+Push this directory to device
-To run on device
+To run hevc_dec_fuzzer on device
```
$ adb sync data
$ adb shell /data/fuzz/hevc_dec_fuzzer CORPUS_DIR
```
-To run on host
+To run hevc_enc_fuzzer on device
+```
+ $ adb sync data
+ $ adb shell /data/fuzz/arm64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR
+```
+
+To run hevc_dec_fuzzer on host
```
- $ $ANDROID_HOST_OUT/fuzz/hevc_dec_fuzzer CORPUS_DIR
+ $ $ANDROID_HOST_OUT/fuzz/x86_64/hevc_dec_fuzzer/hevc_dec_fuzzer CORPUS_DIR
+```
+
+To run hevc_enc_fuzzer on host
+```
+ $ $ANDROID_HOST_OUT/fuzz/x86_64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR
```
-# Fuzzer for libhevc encoder
+# Appendix
+## libhevc encoder fuzzer
## Plugin Design Considerations
The fuzzer plugin for HEVC is designed based on the understanding of the
@@ -142,31 +153,6 @@ This ensures that the plugin tolerates any kind of input (empty, huge,
malformed, etc) and doesnt `exit()` on any input and thereby increasing the
chance of identifying vulnerabilities.
-## Build
-
-This describes steps to build hevc_enc_fuzzer binary.
-
-### Android
-
-#### Steps to build
-Build the fuzzer
-```
- $ mm -j$(nproc) hevc_enc_fuzzer
-```
-
-#### Steps to run
-Create a directory CORPUS_DIR and copy some yuv files to that folder
-Push this directory to device.
-
-To run on device
-```
- $ adb sync data
- $ adb shell /data/fuzz/arm64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR
-```
-To run on host
-```
- $ $ANDROID_HOST_OUT/fuzz/x86_64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR
-```
## References:
* http://llvm.org/docs/LibFuzzer.html
diff --git a/fuzzer/hevc_dec_fuzzer.cmake b/fuzzer/hevc_dec_fuzzer.cmake
new file mode 100644
index 0000000..28e89fd
--- /dev/null
+++ b/fuzzer/hevc_dec_fuzzer.cmake
@@ -0,0 +1,2 @@
+libhevc_add_fuzzer(hevc_dec_fuzzer libhevcdec SOURCES
+ ${HEVC_ROOT}/fuzzer/hevc_dec_fuzzer.cpp)
diff --git a/fuzzer/hevc_enc_fuzzer.cmake b/fuzzer/hevc_enc_fuzzer.cmake
new file mode 100644
index 0000000..908b2f1
--- /dev/null
+++ b/fuzzer/hevc_enc_fuzzer.cmake
@@ -0,0 +1,2 @@
+libhevc_add_fuzzer(hevc_enc_fuzzer libhevcenc SOURCES
+ ${HEVC_ROOT}/fuzzer/hevc_enc_fuzzer.cpp)
diff --git a/fuzzer/hevc_enc_fuzzer.cpp b/fuzzer/hevc_enc_fuzzer.cpp
index 9d0d370..c92d67e 100644
--- a/fuzzer/hevc_enc_fuzzer.cpp
+++ b/fuzzer/hevc_enc_fuzzer.cpp
@@ -19,6 +19,7 @@
*/
#include <algorithm>
#include <memory>
+#include <string.h>
#include "ihevc_typedefs.h"
#include "itt_video_api.h"
diff --git a/fuzzer/ossfuzz.sh b/fuzzer/ossfuzz.sh
index dc5683c..2b0f0f9 100755
--- a/fuzzer/ossfuzz.sh
+++ b/fuzzer/ossfuzz.sh
@@ -22,23 +22,12 @@ test "${OUT}" != "" || exit 1
build_dir=$WORK/build
rm -rf ${build_dir}
mkdir -p ${build_dir}
-pushd ${build_dir}
-cmake $SRC/libhevc
-make -j$(nproc)
+pushd ${build_dir}
+cmake ${SRC}/libhevc
+make -j$(nproc) hevc_dec_fuzzer
+cp ${build_dir}/hevc_dec_fuzzer $OUT/hevc_dec_fuzzer
popd
-# build fuzzers
-$CXX $CXXFLAGS -std=c++11 \
--I$SRC/libhevc \
--I$SRC/libhevc/common \
--I$SRC/libhevc/decoder \
--I${build_dir} \
--Wl,--start-group \
-$LIB_FUZZING_ENGINE \
-$SRC/libhevc/fuzzer/hevc_dec_fuzzer.cpp -o $OUT/hevc_dec_fuzzer \
-${build_dir}/libhevcdec.a \
--Wl,--end-group
-
cp $SRC/hevc_dec_fuzzer_seed_corpus.zip $OUT/hevc_dec_fuzzer_seed_corpus.zip
cp $SRC/libhevc/fuzzer/hevc_dec_fuzzer.dict $OUT/hevc_dec_fuzzer.dict