1#!/bin/bash -eux 2# Copyright 2016 Google Inc. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16################################################################################ 17 18# Disable UBSan vptr since several targets built with -fno-rtti. 19export CFLAGS="$CFLAGS -fno-sanitize=vptr" 20export CXXFLAGS="$CXXFLAGS -fno-sanitize=vptr" 21 22# Build dependencies. 23export FFMPEG_DEPS_PATH=$SRC/ffmpeg_deps 24mkdir -p $FFMPEG_DEPS_PATH 25 26export PATH="$FFMPEG_DEPS_PATH/bin:$PATH" 27export LD_LIBRARY_PATH="$FFMPEG_DEPS_PATH/lib" 28 29cd $SRC 30bzip2 -f -d alsa-lib-* 31tar xf alsa-lib-* 32rm alsa-lib-*.tar 33cd alsa-lib-* 34./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-shared 35make clean 36make -j$(nproc) all 37make install 38 39cd $SRC/fdk-aac 40autoreconf -fiv 41CXXFLAGS="$CXXFLAGS -fno-sanitize=shift-base,signed-integer-overflow" \ 42./configure --prefix="$FFMPEG_DEPS_PATH" --disable-shared 43make clean 44make -j$(nproc) all 45make install 46 47cd $SRC/libXext 48./autogen.sh 49./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static 50make clean 51make -j$(nproc) 52make install 53 54cd $SRC/libva 55./autogen.sh 56./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-shared 57make clean 58make -j$(nproc) all 59make install 60 61cd $SRC/libvdpau 62./autogen.sh 63./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-shared 64make clean 65make -j$(nproc) all 66make install 67 68cd $SRC/libvpx 69LDFLAGS="$CXXFLAGS" ./configure --prefix="$FFMPEG_DEPS_PATH" \ 70 --disable-examples --disable-unit-tests \ 71 --size-limit=12288x12288 \ 72 --extra-cflags="-DVPX_MAX_ALLOCABLE_MEMORY=1073741824" 73make clean 74make -j$(nproc) all 75make install 76 77cd $SRC/ogg 78./autogen.sh 79./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-crc 80make clean 81make -j$(nproc) 82make install 83 84cd $SRC/opus 85./autogen.sh 86./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static 87make clean 88make -j$(nproc) all 89make install 90 91cd $SRC/theora 92# theora requires ogg, need to pass its location to the "configure" script. 93CFLAGS="$CFLAGS -fPIC" LDFLAGS="-L$FFMPEG_DEPS_PATH/lib/" \ 94 CPPFLAGS="$CXXFLAGS -I$FFMPEG_DEPS_PATH/include/" \ 95 LD_LIBRARY_PATH="$FFMPEG_DEPS_PATH/lib/" \ 96 ./autogen.sh 97./configure --with-ogg="$FFMPEG_DEPS_PATH" --prefix="$FFMPEG_DEPS_PATH" \ 98 --enable-static --disable-examples 99make clean 100make -j$(nproc) 101make install 102 103cd $SRC/vorbis 104./autogen.sh 105./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static 106make clean 107make -j$(nproc) 108make install 109 110# Remove shared libraries to avoid accidental linking against them. 111rm $FFMPEG_DEPS_PATH/lib/*.so 112rm $FFMPEG_DEPS_PATH/lib/*.so.* 113 114# Build ffmpeg. 115cd $SRC/ffmpeg 116PKG_CONFIG_PATH="$FFMPEG_DEPS_PATH/lib/pkgconfig" ./configure \ 117 --cc=$CC --cxx=$CXX --ld="$CXX $CXXFLAGS -std=c++11" \ 118 --extra-cflags="-I$FFMPEG_DEPS_PATH/include" \ 119 --extra-ldflags="-L$FFMPEG_DEPS_PATH/lib" \ 120 --prefix="$FFMPEG_DEPS_PATH" \ 121 --pkg-config-flags="--static" \ 122 --enable-ossfuzz \ 123 --libfuzzer=$LIB_FUZZING_ENGINE \ 124 --optflags=-O1 \ 125 --enable-gpl \ 126 --enable-libass \ 127 --enable-libfdk-aac \ 128 --enable-libfreetype \ 129 --enable-libopus \ 130 --enable-libtheora \ 131 --enable-libvorbis \ 132 --enable-libvpx \ 133 --enable-nonfree \ 134 --disable-muxers \ 135 --disable-protocols \ 136 --disable-demuxer=rtp,rtsp,sdp \ 137 --disable-devices \ 138 --disable-shared 139make clean 140make -j$(nproc) install 141 142# Download test samples, will be used as seed corpus. 143# DISABLED. 144# TODO: implement a better way to maintain a minimized seed corpora 145# for all targets. As of 2017-05-04 now the combined size of corpora 146# is too big for ClusterFuzz (over 10Gb compressed data). 147export TEST_SAMPLES_PATH=$SRC/ffmpeg/fate-suite/ 148make fate-rsync SAMPLES=$TEST_SAMPLES_PATH 149 150# Build the fuzzers. 151cd $SRC/ffmpeg 152 153FUZZ_TARGET_SOURCE=$SRC/ffmpeg/tools/target_dec_fuzzer.c 154 155export TEMP_VAR_CODEC="AV_CODEC_ID_H264" 156export TEMP_VAR_CODEC_TYPE="VIDEO" 157 158CONDITIONALS=`grep 'BSF 1$' config.h | sed 's/#define CONFIG_\(.*\)_BSF 1/\1/'` 159if [ -n "${OSS_FUZZ_CI-}" ]; then 160 # When running in CI, check the first targets only to save time and disk space 161 CONDITIONALS=( ${CONDITIONALS[@]:0:2} ) 162fi 163for c in $CONDITIONALS ; do 164 fuzzer_name=ffmpeg_BSF_${c}_fuzzer 165 symbol=`echo $c | sed "s/.*/\L\0/"` 166 echo -en "[libfuzzer]\nmax_len = 1000000\n" > $OUT/${fuzzer_name}.options 167 make tools/target_bsf_${symbol}_fuzzer 168 mv tools/target_bsf_${symbol}_fuzzer $OUT/${fuzzer_name} 169done 170 171# Build fuzzers for decoders. 172CONDITIONALS=`grep 'DECODER 1$' config.h | sed 's/#define CONFIG_\(.*\)_DECODER 1/\1/'` 173if [ -n "${OSS_FUZZ_CI-}" ]; then 174 # When running in CI, check the first targets only to save time and disk space 175 CONDITIONALS=( ${CONDITIONALS[@]:0:2} ) 176fi 177for c in $CONDITIONALS ; do 178 fuzzer_name=ffmpeg_AV_CODEC_ID_${c}_fuzzer 179 symbol=`echo $c | sed "s/.*/\L\0/"` 180 echo -en "[libfuzzer]\nmax_len = 1000000\n" > $OUT/${fuzzer_name}.options 181 make tools/target_dec_${symbol}_fuzzer 182 mv tools/target_dec_${symbol}_fuzzer $OUT/${fuzzer_name} 183done 184 185# Build fuzzer for demuxer 186fuzzer_name=ffmpeg_DEMUXER_fuzzer 187echo -en "[libfuzzer]\nmax_len = 1000000\n" > $OUT/${fuzzer_name}.options 188make tools/target_dem_fuzzer 189mv tools/target_dem_fuzzer $OUT/${fuzzer_name} 190 191# We do not need raw reference files for the muxer 192rm `find fate-suite -name '*.s16'` 193rm `find fate-suite -name '*.dec'` 194rm `find fate-suite -name '*.pcm'` 195 196zip -r $OUT/${fuzzer_name}_seed_corpus.zip fate-suite 197zip -r $OUT/ffmpeg_AV_CODEC_ID_HEVC_fuzzer_seed_corpus.zip fate-suite/hevc fate-suite/hevc-conformance 198 199# Build fuzzer for demuxer fed at IO level 200fuzzer_name=ffmpeg_IO_DEMUXER_fuzzer 201make tools/target_io_dem_fuzzer 202mv tools/target_io_dem_fuzzer $OUT/${fuzzer_name} 203 204#Build fuzzers for individual demuxers 205PKG_CONFIG_PATH="$FFMPEG_DEPS_PATH/lib/pkgconfig" ./configure \ 206 --cc=$CC --cxx=$CXX --ld="$CXX $CXXFLAGS -std=c++11" \ 207 --extra-cflags="-I$FFMPEG_DEPS_PATH/include" \ 208 --extra-ldflags="-L$FFMPEG_DEPS_PATH/lib" \ 209 --prefix="$FFMPEG_DEPS_PATH" \ 210 --pkg-config-flags="--static" \ 211 --enable-ossfuzz \ 212 --libfuzzer=$LIB_FUZZING_ENGINE \ 213 --optflags=-O1 \ 214 --enable-gpl \ 215 --disable-muxers \ 216 --disable-protocols \ 217 --disable-devices \ 218 --disable-shared \ 219 --disable-encoders \ 220 --disable-filters \ 221 --disable-muxers \ 222 --disable-parsers \ 223 --disable-decoders \ 224 --disable-hwaccels \ 225 --disable-bsfs \ 226 --disable-vaapi \ 227 --disable-vdpau \ 228 --disable-crystalhd \ 229 --disable-v4l2_m2m \ 230 --disable-cuda_llvm \ 231 --enable-demuxers \ 232 --disable-demuxer=rtp,rtsp,sdp \ 233 234CONDITIONALS=`grep 'DEMUXER 1$' config.h | sed 's/#define CONFIG_\(.*\)_DEMUXER 1/\1/'` 235if [ -n "${OSS_FUZZ_CI-}" ]; then 236 # When running in CI, check the first targets only to save time and disk space 237 CONDITIONALS=( ${CONDITIONALS[@]:0:2} ) 238fi 239for c in $CONDITIONALS ; do 240 fuzzer_name=ffmpeg_dem_${c}_fuzzer 241 symbol=`echo $c | sed "s/.*/\L\0/"` 242 make tools/target_dem_${symbol}_fuzzer 243 mv tools/target_dem_${symbol}_fuzzer $OUT/${fuzzer_name} 244done 245 246# Find relevant corpus in test samples and archive them for every fuzzer. 247#cd $SRC 248#python group_seed_corpus.py $TEST_SAMPLES_PATH $OUT/ 249