Message ID | 20191129213424.6290-14-alxndr@bu.edu |
---|---|
State | New |
Headers | show |
Series | Add virtual device fuzzing support | expand |
On 11/29/19 10:34 PM, Oleinik, Alexander wrote: > Signed-off-by: Alexander Bulekov <alxndr@bu.edu> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > configure | 39 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 39 insertions(+) > > diff --git a/configure b/configure > index 6099be1d84..5fb2494a8e 100755 > --- a/configure > +++ b/configure > @@ -504,6 +504,7 @@ debug_mutex="no" > libpmem="" > default_devices="yes" > plugins="no" > +fuzzing="no" > > supported_cpu="no" > supported_os="no" > @@ -633,6 +634,15 @@ int main(void) { return 0; } > EOF > } > > +write_c_fuzzer_skeleton() { > + cat > $TMPC <<EOF > +#include <stdint.h> > +#include <sys/types.h> > +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); > +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } > +EOF > +} > + > if check_define __linux__ ; then > targetos="Linux" > elif check_define _WIN32 ; then > @@ -1539,6 +1549,10 @@ for opt do > ;; > --disable-plugins) plugins="no" > ;; > + --enable-fuzzing) fuzzing=yes > + ;; > + --disable-fuzzing) fuzzing=no > + ;; > *) > echo "ERROR: unknown option $opt" > echo "Try '$0 --help' for more information" > @@ -6018,6 +6032,15 @@ EOF > fi > fi > > +########################################## > +# checks for fuzzer > +if test "$fuzzing" = "yes" ; then > + write_c_fuzzer_skeleton > + if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address,fuzzer" ""; then > + have_fuzzer=yes > + fi > +fi > + > ########################################## > # check for libpmem > > @@ -6599,6 +6622,7 @@ echo "libpmem support $libpmem" > echo "libudev $libudev" > echo "default devices $default_devices" > echo "plugin support $plugins" > +echo "fuzzing support $fuzzing" > > if test "$supported_cpu" = "no"; then > echo > @@ -7435,6 +7459,16 @@ fi > if test "$sheepdog" = "yes" ; then > echo "CONFIG_SHEEPDOG=y" >> $config_host_mak > fi > +if test "$fuzzing" = "yes" ; then > + if test "$have_fuzzer" = "yes"; then > + FUZZ_LDFLAGS=" -fsanitize=address,fuzzer" > + FUZZ_CFLAGS=" -fsanitize=address,fuzzer" > + CFLAGS=" -fsanitize=address" > + else > + error_exit "Your compiler doesn't support -fsanitize=address,fuzzer" > + exit 1 > + fi > +fi > > if test "$plugins" = "yes" ; then > echo "CONFIG_PLUGIN=y" >> $config_host_mak > @@ -7538,6 +7572,11 @@ if test "$libudev" != "no"; then > echo "CONFIG_LIBUDEV=y" >> $config_host_mak > echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak > fi > +if test "$fuzzing" != "no"; then I'd use '= "yes"' here to stay consistent. Anyway: Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > + echo "CONFIG_FUZZ=y" >> $config_host_mak > + echo "FUZZ_CFLAGS=$FUZZ_CFLAGS" >> $config_host_mak > + echo "FUZZ_LDFLAGS=$FUZZ_LDFLAGS" >> $config_host_mak > +fi > > if test "$edk2_blobs" = "yes" ; then > echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak >
diff --git a/configure b/configure index 6099be1d84..5fb2494a8e 100755 --- a/configure +++ b/configure @@ -504,6 +504,7 @@ debug_mutex="no" libpmem="" default_devices="yes" plugins="no" +fuzzing="no" supported_cpu="no" supported_os="no" @@ -633,6 +634,15 @@ int main(void) { return 0; } EOF } +write_c_fuzzer_skeleton() { + cat > $TMPC <<EOF +#include <stdint.h> +#include <sys/types.h> +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } +EOF +} + if check_define __linux__ ; then targetos="Linux" elif check_define _WIN32 ; then @@ -1539,6 +1549,10 @@ for opt do ;; --disable-plugins) plugins="no" ;; + --enable-fuzzing) fuzzing=yes + ;; + --disable-fuzzing) fuzzing=no + ;; *) echo "ERROR: unknown option $opt" echo "Try '$0 --help' for more information" @@ -6018,6 +6032,15 @@ EOF fi fi +########################################## +# checks for fuzzer +if test "$fuzzing" = "yes" ; then + write_c_fuzzer_skeleton + if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address,fuzzer" ""; then + have_fuzzer=yes + fi +fi + ########################################## # check for libpmem @@ -6599,6 +6622,7 @@ echo "libpmem support $libpmem" echo "libudev $libudev" echo "default devices $default_devices" echo "plugin support $plugins" +echo "fuzzing support $fuzzing" if test "$supported_cpu" = "no"; then echo @@ -7435,6 +7459,16 @@ fi if test "$sheepdog" = "yes" ; then echo "CONFIG_SHEEPDOG=y" >> $config_host_mak fi +if test "$fuzzing" = "yes" ; then + if test "$have_fuzzer" = "yes"; then + FUZZ_LDFLAGS=" -fsanitize=address,fuzzer" + FUZZ_CFLAGS=" -fsanitize=address,fuzzer" + CFLAGS=" -fsanitize=address" + else + error_exit "Your compiler doesn't support -fsanitize=address,fuzzer" + exit 1 + fi +fi if test "$plugins" = "yes" ; then echo "CONFIG_PLUGIN=y" >> $config_host_mak @@ -7538,6 +7572,11 @@ if test "$libudev" != "no"; then echo "CONFIG_LIBUDEV=y" >> $config_host_mak echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak fi +if test "$fuzzing" != "no"; then + echo "CONFIG_FUZZ=y" >> $config_host_mak + echo "FUZZ_CFLAGS=$FUZZ_CFLAGS" >> $config_host_mak + echo "FUZZ_LDFLAGS=$FUZZ_LDFLAGS" >> $config_host_mak +fi if test "$edk2_blobs" = "yes" ; then echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak