blob: f5134bd8228d0bf2409b187cdac50171020eec79 [file] [log] [blame]
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//third_party/blink/renderer/build/scripts/scripts.gni")
import("//third_party/blink/renderer/modules/modules.gni")
import("//third_party/libprotobuf-mutator/fuzzable_proto_library.gni")
import("//third_party/protobuf/proto_library.gni")
blink_modules_sources("sanitizer_api") {
sources = [
"$target_gen_dir/builtins/sanitizer_attribute_lists.cc",
"$target_gen_dir/builtins/sanitizer_builtins.cc",
"builtins.cc",
"builtins.h",
"builtins/sanitizer_builtins.h",
"config_util.cc",
"config_util.h",
"element_sanitizer.cc",
"element_sanitizer.h",
"sanitizer.cc",
"sanitizer.h",
"sanitizer_config_impl.h",
]
deps = [
":generate_sanitizer_attribute_lists",
":generate_sanitizer_builtins",
]
}
# The Sanitizer API relies on several spec-defined constants. For easier
# maintenance we generate the constants from spec snippets.
action("generate_sanitizer_builtins") {
script = "builtins/generate_builtins.py"
source_attributes = "builtins/baseline_attribute_allow_list.txt"
source_elements = "builtins/baseline_element_allow_list.txt"
source_default = "builtins/default_configuration.txt"
sources = [
source_attributes,
source_default,
source_elements,
]
outputs = [ "$target_gen_dir/builtins/sanitizer_builtins.cc" ]
args = [
"--out",
rebase_path(outputs[0], root_build_dir),
"--baseline-elements",
rebase_path(source_elements, root_build_dir),
"--baseline-attributes",
rebase_path(source_attributes, root_build_dir),
"--default-configuration",
rebase_path(source_default, root_build_dir),
]
}
blink_python_runner("generate_sanitizer_attribute_lists") {
script = "builtins/generate_attribute_lists.py"
sources =
[ "//third_party/blink/renderer/core/html/html_attribute_names.json5" ]
inputs = sources + scripts_for_json5_files
outputs = [ "$target_gen_dir/builtins/sanitizer_attribute_lists.cc" ]
args = [
"--out",
rebase_path(outputs[0], root_build_dir),
]
foreach(source, sources) {
args += [ rebase_path(source, root_build_dir) ]
}
}
if (use_fuzzing_engine_with_lpm) {
corpus_out_dir = "$target_gen_dir/corpus"
# For our seed corpus, we have several .html files and several proto config
# files. We'll assemble a list of all N x M combinations for the corpus.
corpus_source_config = [ # These match source files: corpus/*.txt
"config1",
"config2",
"config3",
"default",
]
corpus_source_html = [ # These match source files: corpus/*.html
"simple1",
"simple2",
"simple3",
"simple4",
"medium1",
"medium2",
"medium3",
]
corpus_sources = []
corpus_outputs = []
foreach(f, corpus_source_config) {
corpus_sources += [ "corpus/$f.txt" ]
}
foreach(f, corpus_source_html) {
corpus_sources += [ "corpus/$f.html" ]
}
foreach(conf, corpus_source_config) {
foreach(html, corpus_source_html) {
corpus_outputs += [ "$corpus_out_dir/$html-$conf.txt" ]
}
}
# The build_corpus.py script assembles our corpus files.
# The $corpus_sources/$corpus_outputs match what the script requires.
# It additionally builds a dictionary (of all "words" it finds in the html
# inputs.
action("generate_sanitizer_fuzzer_corpus") {
script = "build_corpus.py"
sources = corpus_sources
outputs = [ "$target_gen_dir/sanitizer_api.dict" ] + corpus_outputs
args = rebase_path(sources, root_build_dir) + [
"--outdir",
rebase_path("$corpus_out_dir", root_build_dir),
"--dict",
rebase_path("$target_gen_dir/sanitizer_api.dict", root_build_dir),
]
}
fuzzable_proto_library("sanitizer_config_proto") {
sources = [ "sanitizer_config.proto" ]
}
fuzzer_test("sanitizer_api_fuzzer") {
sources = [ "sanitizer_api_fuzzer.cc" ]
deps = [
":generate_sanitizer_fuzzer_corpus",
":sanitizer_config_proto",
"//third_party/blink/renderer/controller:blink_bindings_test_sources",
"//third_party/blink/renderer/core:testing",
"//third_party/blink/renderer/modules:modules",
"//third_party/blink/renderer/platform:blink_fuzzer_test_support",
"//third_party/libprotobuf-mutator",
"//third_party/protobuf:protobuf_lite",
]
# The fuzzer_test rule accepts dependencies for seed_corpus
# (in seed_corpus_deps), but not for dict. Hence, we just copy that file.
dict = "sanitizer_api.dict"
seed_corpus = "$corpus_out_dir"
seed_corpus_deps = [ ":generate_sanitizer_fuzzer_corpus" ]
}
}