summaryrefslogtreecommitdiff
path: root/test/fuzz/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'test/fuzz/meson.build')
-rw-r--r--test/fuzz/meson.build68
1 files changed, 62 insertions, 6 deletions
diff --git a/test/fuzz/meson.build b/test/fuzz/meson.build
index 80362d4154..f7f0a6111c 100644
--- a/test/fuzz/meson.build
+++ b/test/fuzz/meson.build
@@ -1,5 +1,36 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
+generate_directives_py = find_program('generate-directives.py')
+fuzz_generated_in_dir = meson.current_build_dir()
+
+fuzz_generated_directives = []
+
+directives = [['fuzz-network-parser_directives', 'src/network/networkd-network-gperf.gperf'],
+ ['fuzz-netdev-parser_directives.netdev', 'src/network/netdev/netdev-gperf.gperf'],
+ ['fuzz-link-parser_directives.link', 'src/udev/net/link-config-gperf.gperf'],
+ ]
+
+foreach tuple : directives
+ fuzz_generated_directives += custom_target(
+ tuple[0],
+ output: tuple[0],
+ command: [generate_directives_py, files(project_source_root / tuple[1])],
+ capture: true)
+endforeach
+
+foreach section : ['Automount', 'Mount', 'Path', 'Scope', 'Service', 'Slice', 'Socket', 'Swap', 'Timer']
+ unit_type = section.to_lower()
+ sec_rx = section == 'Service' ? '(Service|Unit|Install)' : section
+ fuzz_generated_directives += custom_target(
+ 'fuzz-unit-file_directives.@0@'.format(unit_type),
+ output: 'fuzz-unit-file_directives.@0@'.format(unit_type),
+ command: [generate_directives_py, load_fragment_gperf_gperf, sec_rx, unit_type],
+ capture: true)
+endforeach
+
+
+############################################################
+
sanitize_address_undefined = custom_target(
'sanitize-address-undefined-fuzzers',
output : 'sanitize-address-undefined-fuzzers',
@@ -16,24 +47,49 @@ sanitize_address_undefined = custom_target(
' '.join(cc.cmd_array()),
cxx_cmd])
-sanitizers = [['address,undefined', sanitize_address_undefined]]
+fuzz_sanitizers = [['address,undefined', sanitize_address_undefined]]
+fuzz_testsdir = 'test/fuzz'
if git.found() and fs.exists(project_source_root / '.git')
out = run_command(env, '-u', 'GIT_WORK_TREE',
git, '--git-dir=@0@/.git'.format(project_source_root),
- 'ls-files', ':/test/fuzz/*/*',
+ 'ls-files', ':/@0@/*/*'.format(fuzz_testsdir),
check: true)
else
- out = run_command(sh, '-c', 'cd "@0@"; echo test/fuzz/*/*'.format(project_source_root), check: true)
+ out = run_command(sh, '-c', 'cd "@0@"; echo @1@/*/*'.format(project_source_root, fuzz_testsdir), check: true)
endif
-fuzz_regression_tests = []
+# Fuzz inputs that we generate (see above fuzz_generated_directives)
+fuzz_regression_tests = {
+ 'fuzz-link-parser': [['', 'directives.link']],
+ 'fuzz-netdev-parser': [['', 'directives.netdev']],
+ 'fuzz-network-parser': [['', 'directives']],
+ 'fuzz-unit-file': [['', 'directives.automount'],
+ ['', 'directives.mount'],
+ ['', 'directives.path'],
+ ['', 'directives.scope'],
+ ['', 'directives.service'],
+ ['', 'directives.slice'],
+ ['', 'directives.socket'],
+ ['', 'directives.swap'],
+ ['', 'directives.timer']]}
+
+# Add crafted fuzz inputs we have in the repo
foreach p : out.stdout().split()
# Remove the last entry which is ''.
#
# Also, backslashes get mangled, so skip test. See
# https://github.com/mesonbuild/meson/issues/1564.
- if not p.contains('\\')
- fuzz_regression_tests += p
+ if p.contains('\\')
+ continue
+ endif
+ fuzzer = p.split('/')[-2]
+ fuzz_in = p.split('/')[-1]
+ if fuzzer not in fuzz_regression_tests
+ fuzz_regression_tests += {fuzzer: []}
endif
+ # Meson parser provision for: fuzz_regression_tests[fuzzer] += [fuzz_in]
+ l = fuzz_regression_tests[fuzzer]
+ l += [[fuzz_testsdir, fuzz_in]]
+ fuzz_regression_tests += {fuzzer: l}
endforeach