diff --git a/fuzzing/build-oss-fuzz.sh b/fuzzing/build-oss-fuzz.sh new file mode 100644 index 0000000000..b36e4b5442 --- /dev/null +++ b/fuzzing/build-oss-fuzz.sh @@ -0,0 +1,161 @@ +#!/bin/bash -eu + +# build-oss-fuzz.sh +# +# Build script which is executed by oss-fuzz build.sh +# +# $SRC: location of code checkouts +# $OUT: location to put fuzzing targets and corpus +# $WORK: writable directory where all compilation should be executed +# +# /!\ Do not override any CC, CXX, CFLAGS, ... variables +# + +# This script is divided in two parts +# +# 1) Build all the dependencies statically +# +# 2) Build the fuzzing targets + +# Prefix where we will temporarily install everything +PREFIX=$WORK/prefix +mkdir -p $PREFIX +export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig +export PATH=$PREFIX/bin:$PATH + +# Minimize gst-debug level/code +export CFLAGS="$CFLAGS -DGST_LEVEL_MAX=2" + +# +echo "CFLAGS : " $CFLAGS +echo "CXXFLAGS : " $CXXFLAGS +PLUGIN_DIR=$PREFIX/lib/gstreamer-1.0 + +# Switch to work directory +cd $WORK + +# 1) BUILD GLIB AND GSTREAMER +# Note: we build glib ourselves so that we get proper malloc/free backtraces +tar xvJf $SRC/glib-2.54.2.tar.xz +cd glib-2.54.2 +./configure --prefix=$PREFIX --enable-static --disable-shared --disable-libmount --with-pcre=internal && make -j$(nproc) && make install +cd .. + +# Note: We don't use/build orc since it still seems to be problematic +# with clang and the various sanitizers. + +# For now we only build core and base. Add other modules when/if needed +for i in gstreamer gst-plugins-base; +do + mkdir -p $i + cd $i + $SRC/$i/autogen.sh --prefix=$PREFIX --disable-shared --enable-static --disable-examples \ + --disable-gtk-doc --disable-introspection --enable-static-plugins \ + --disable-gst-tracer-hooks --disable-registry + make -j$(nproc) + make install + cd .. +done + + + +# 2) Build the target fuzzers + +# All targets will be linked in with $LIB_FUZZING_ENGINE which contains the +# actual fuzzing runner. Anything fuzzing engine can be used provided it calls +# the same function as libfuzzer. + +# Note: The fuzzer .o needs to be first compiled with CC and then linked with CXX + +# We want to statically link everything, except for shared libraries +# that are present on the base image. Those need to be specified +# beforehand and explicitely linked dynamically If any of the static +# dependencies require a pre-installed shared library, you need to add +# that library to the following list +PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -pthread -lrt -lpthread" + +# These are the basic .pc dependencies required to build any of the fuzzing targets +# That is : glib, gstreamer core and gst-app +# The extra target-specific dependencies are to be specified later +COMMON_DEPS="glib-2.0 gstreamer-1.0 gstreamer-app-1.0" + +# For each target, defined the following: +# TARGET_DEPS : Extra .pc dependencies for the target (in addition to $COMMON_DEPS) +# All dependencies (including sub-dependencies) must be speecified +# PLUGINS : .a of the plugins to link +# They must match the static plugins declared/registered in the target + +# +# TARGET : push-based ogg/theora/vorbis discoverer +# +# FIXME : Rename to discoverer_push_oggtheoravorbis + +TARGET_DEPS=" gstreamer-pbutils-1.0 \ + gstreamer-video-1.0 \ + gstreamer-audio-1.0 \ + gstreamer-riff-1.0 \ + gstreamer-tag-1.0 \ + zlib ogg vorbis vorbisenc \ + theoraenc theoradec theora" + +PLUGINS="$PLUGIN_DIR/libgstcoreelements.a \ + $PLUGIN_DIR/libgsttypefindfunctions.a \ + $PLUGIN_DIR/libgstplayback.a \ + $PLUGIN_DIR/libgstapp.a \ + $PLUGIN_DIR/libgstvorbis.a \ + $PLUGIN_DIR/libgsttheora.a \ + $PLUGIN_DIR/libgstogg.a" + +echo +echo ">>>> BUILDING gst-discoverer.o" +echo +BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $COMMON_DEPS $TARGET_DEPS`" +BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $COMMON_DEPS $TARGET_DEPS`" + +$CC $CFLAGS $BUILD_CFLAGS -c $SRC/gst-ci/fuzzing/gst-discoverer.c -o $SRC/gst-ci/fuzzing/gst-discoverer.o +$CXX $CXXFLAGS \ + -o $OUT/gst-discoverer \ + $PREDEPS_LDFLAGS \ + $SRC/gst-ci/fuzzing/gst-discoverer.o \ + $PLUGINS \ + $BUILD_LDFLAGS \ + $LIB_FUZZING_ENGINE \ + -Wl,-Bdynamic + +# +# TARGET : push-based typefind +# + +# typefindfunction depends on pbutils which depends on gst{audio|video|tag} +TARGET_DEPS=" gstreamer-pbutils-1.0 \ + gstreamer-video-1.0 \ + gstreamer-audio-1.0 \ + gstreamer-tag-1.0" + +PLUGINS="$PLUGIN_DIR/libgstcoreelements.a \ + $PLUGIN_DIR/libgsttypefindfunctions.a \ + $PLUGIN_DIR/libgstapp.a" + +echo +echo ">>>> BUILDING gst-discoverer.o" +echo +BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $COMMON_DEPS $TARGET_DEPS`" +BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $COMMON_DEPS $TARGET_DEPS`" + +$CC $CFLAGS $BUILD_CFLAGS -c $SRC/gst-ci/fuzzing/typefind.c -o $SRC/gst-ci/fuzzing/typefind.o +$CXX $CXXFLAGS \ + -o $OUT/typefind \ + $PREDEPS_LDFLAGS \ + $SRC/gst-ci/fuzzing/typefind.o \ + $PLUGINS \ + $BUILD_LDFLAGS \ + $LIB_FUZZING_ENGINE \ + -Wl,-Bdynamic + +echo +echo ">>>> Installing seed corpus" +echo +# FIXME : Sadly we apparently need to have the corpus downloaded in the +# Dockerfile and not here. + +cp $SRC/*_seed_corpus.zip $OUT