• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2# Copyright 2018 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# This script is meant to be run by the oss-fuzz infrastructure from the script
19# https://github.com/google/oss-fuzz/blob/master/projects/libwebp/build.sh
20# It builds the different fuzz targets.
21# Only the libfuzzer engine is supported.
22
23# To test changes to this file:
24# - make changes and commit to your REPO
25# - run:
26#     git clone --depth=1 git@github.com:google/oss-fuzz.git
27#     cd oss-fuzz
28# - modify projects/libwebp/Dockerfile to point to your REPO
29# - run:
30#     python3 infra/helper.py build_image libwebp
31#     # enter 'y' and wait for everything to be downloaded
32# - run:
33#     python3 infra/helper.py build_fuzzers --sanitizer address libwebp
34#     # wait for the tests to be built
35# And then run the fuzzer locally, for example:
36#     python3 infra/helper.py run_fuzzer libwebp \
37#     --sanitizer address \
38#     animencoder_fuzzer@AnimEncoder.AnimEncoderTest
39
40set -eu
41
42EXTRA_CMAKE_FLAGS=""
43export CXXFLAGS="${CXXFLAGS} -DFUZZTEST_COMPATIBILITY_MODE"
44EXTRA_CMAKE_FLAGS="-DFUZZTEST_COMPATIBILITY_MODE=libfuzzer"
45
46# limit allocation size to reduce spurious OOMs
47WEBP_CFLAGS="$CFLAGS -DWEBP_MAX_IMAGE_SIZE=838860800" # 800MiB
48
49export CFLAGS="$WEBP_CFLAGS"
50cmake -S . -B build -DWEBP_BUILD_FUZZTEST=ON ${EXTRA_CMAKE_FLAGS}
51cd build && make -j$(nproc) && cd ..
52
53find $SRC/libwebp-test-data -type f -size -32k -iname "*.webp" \
54  -exec zip -qju fuzz_seed_corpus.zip "{}" \;
55
56# The following is taken from https://github.com/google/oss-fuzz/blob/31ac7244748ea7390015455fb034b1f4eda039d9/infra/base-images/base-builder/compile_fuzztests.sh#L59
57# Iterate the fuzz binaries and list each fuzz entrypoint in the binary. For
58# each entrypoint create a wrapper script that calls into the binaries the
59# given entrypoint as argument.
60# The scripts will be named:
61# {binary_name}@{fuzztest_entrypoint}
62FUZZ_TEST_BINARIES_OUT_PATHS=$(find ./build/tests/fuzzer/ -executable -type f)
63echo "Fuzz binaries: $FUZZ_TEST_BINARIES_OUT_PATHS"
64for fuzz_main_file in $FUZZ_TEST_BINARIES_OUT_PATHS; do
65  FUZZ_TESTS=$($fuzz_main_file --list_fuzz_tests | cut -d ' ' -f 4)
66  cp -f ${fuzz_main_file} $OUT/
67  fuzz_basename=$(basename $fuzz_main_file)
68  chmod -x $OUT/$fuzz_basename
69  for fuzz_entrypoint in $FUZZ_TESTS; do
70    TARGET_FUZZER="${fuzz_basename}@$fuzz_entrypoint"
71    # Write executer script
72    cat << EOF > $OUT/$TARGET_FUZZER
73#!/bin/sh
74# LLVMFuzzerTestOneInput for fuzzer detection.
75this_dir=\$(dirname "\$0")
76export TEST_DATA_DIRS=\$this_dir/corpus
77chmod +x \$this_dir/$fuzz_basename
78\$this_dir/$fuzz_basename --fuzz=$fuzz_entrypoint -- \$@
79chmod -x \$this_dir/$fuzz_basename
80EOF
81    chmod +x $OUT/$TARGET_FUZZER
82  done
83  # Copy data.
84  cp fuzz_seed_corpus.zip $OUT/${fuzz_basename}_seed_corpus.zip
85  cp tests/fuzzer/fuzz.dict $OUT/${fuzz_basename}.dict
86done
87