| # 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" ] |
| } |
| } |