]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
meson: also merge declarations of fuzzers with other executables
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 26 Jun 2023 16:07:25 +0000 (01:07 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 3 Aug 2023 11:37:16 +0000 (20:37 +0900)
14 files changed:
meson.build
src/boot/efi/meson.build
src/core/meson.build
src/journal-remote/meson.build
src/journal/meson.build
src/libsystemd-network/meson.build
src/network/meson.build
src/nspawn/meson.build
src/resolve/meson.build
src/systemctl/meson.build
src/udev/meson.build
src/xdg-autostart-generator/meson.build
test/fuzz/meson.build
test/meson.build

index 320302f15d5370088bc77389570385d3f5c690e2..cf217c1bf0f711b649078b16f08389e6706be217 100644 (file)
@@ -2174,12 +2174,12 @@ man_page_depends = []
 
 simple_tests = []
 libsystemd_tests = []
-fuzzers = []
 simple_fuzzers = []
 catalogs = []
 modules = [] # nss, pam, and other plugins
 executables = []
 executables_by_name = {}
+fuzzer_exes = []
 
 # binaries that have --help and are intended for use by humans,
 # usually, but not always, installed in /bin.
@@ -2354,6 +2354,29 @@ test_additional_kwargs = {
         'link_depends' : runtest_env,
 }
 
+fuzz_template = executable_template + {
+        'build_by_default' : fuzzer_build,
+        'install' : false,
+}
+
+if want_ossfuzz or (want_libfuzzer and fuzzing_engine.found())
+        fuzz_additional_kwargs = {
+                'dependencies' : fuzzing_engine,
+        }
+elif want_libfuzzer and not fuzzing_engine.found()
+        fuzz_additional_kwargs = {
+                'link_args' : ['-fsanitize=fuzzer'],
+        }
+else
+        fuzz_additional_kwargs = {
+                'sources' : files('src/fuzz/fuzz-main.c'),
+        }
+endif
+fuzz_additional_kwargs += {
+        'include_directories' : include_directories('src/fuzz'),
+        'c_args' : test_cflags,
+}
+
 nss_template = {
         'version' : '2',
         'include_directories' : includes,
@@ -2502,6 +2525,7 @@ subdir('src/systemd')
 subdir('src/test')
 subdir('src/fuzz')
 subdir('src/ukify/test')  # needs to be last for test_env variable
+subdir('test/fuzz')
 
 alias_target('devel', libsystemd_pc, libudev_pc, systemd_pc, udev_pc)
 
@@ -2515,14 +2539,19 @@ foreach test : libsystemd_tests
         executables += test_template + test
 endforeach
 
+foreach fuzzer : simple_fuzzers
+        executables += fuzz_template + { 'sources' : [fuzzer] }
+endforeach
+
 foreach dict : executables
         name = dict.get('name', '')
         if name == ''
                 name = fs.stem(dict.get('sources')[0])
-                assert(name.split('-')[0] == 'test')
+                assert(name.split('-')[0] in ['test', 'fuzz'])
         endif
 
         is_test = name.startswith('test-')
+        is_fuzz = name.startswith('fuzz-')
 
         build = true
         foreach cond : dict.get('conditions', [])
@@ -2556,6 +2585,12 @@ foreach dict : executables
                 endforeach
         endif
 
+        if is_fuzz
+                foreach key, val : fuzz_additional_kwargs
+                        kwargs += { key : [ kwargs.get(key, []), val ] }
+                endforeach
+        endif
+
         exe = executable(
                 name,
                 kwargs : kwargs,
@@ -2594,8 +2629,33 @@ foreach dict : executables
                              is_parallel : dict.get('parallel', true))
                 endif
         endif
+
+        if is_fuzz
+                fuzzer_exes += exe
+
+                if want_tests != 'false'
+                        # Run the fuzz regression tests without any sanitizers enabled.
+                        # Additional invocations with sanitizers may be added below.
+                        fuzz_ins = fuzz_regression_tests.get(name, {})
+                        foreach directive : fuzz_ins.get('directives', [])
+                                test('@0@_@1@'.format(name, fs.name(directive.full_path())),
+                                     exe,
+                                     suite : 'fuzz',
+                                     args : directive.full_path(),
+                                     depends : directive)
+                        endforeach
+                        foreach file : fuzz_ins.get('files', [])
+                                test('@0@_@1@'.format(name, fs.name(file)),
+                                     exe,
+                                     suite : 'fuzz',
+                                     args : file)
+                        endforeach
+                endif
+        endif
 endforeach
 
+alias_target('fuzzers', fuzzer_exes)
+
 ############################################################
 
 test_dlopen = executables_by_name.get('test-dlopen')
@@ -2677,71 +2737,6 @@ subdir('test')
 
 ############################################################
 
-foreach fuzzer : simple_fuzzers
-        fuzzers += { 'sources' : [fuzzer] }
-endforeach
-
-fuzzer_exes = []
-
-foreach fuzzer : fuzzers
-        sources = fuzzer.get('sources')
-        base = fuzzer.get('base', {})
-        dependencies = [base.get('dependencies', []), fuzzer.get('dependencies', [])]
-        link_args = []
-
-        if want_ossfuzz
-                dependencies += fuzzing_engine
-        elif want_libfuzzer
-                if fuzzing_engine.found()
-                        dependencies += fuzzing_engine
-                else
-                        link_args += ['-fsanitize=fuzzer']
-                endif
-        else
-                sources += files('src/fuzz/fuzz-main.c')
-        endif
-        sources += fuzz_generated_directives
-
-        name = fs.stem(sources[0])
-
-        exe = executable(
-                name,
-                sources,
-                include_directories : [
-                        base.get('includes', []),
-                        fuzzer.get('includes', includes),
-                        include_directories('src/fuzz'),
-                ],
-                link_with : [base.get('link_with', []), fuzzer.get('link_with', libshared)],
-                dependencies : [
-                        dependencies,
-                        userspace,
-                ],
-                c_args : [test_cflags, fuzzer.get('c_args', [])],
-                link_args: link_args,
-                install : false,
-                build_by_default : fuzzer_build)
-        fuzzer_exes += exe
-
-        if want_tests != 'false' and name in fuzz_regression_tests
-                # Run the fuzz regression tests without any sanitizers enabled.
-                # Additional invocations with sanitizers may be added below.
-                foreach tuple : fuzz_regression_tests[name]
-                        fuzz_dir = tuple[0]
-                        fuzz_in = tuple[1]
-                        test('@0@_@1@'.format(name, fuzz_in),
-                             exe,
-                             suite : 'fuzz',
-                             args : [fuzz_dir != '' ? project_source_root / fuzz_dir / name / fuzz_in
-                                                    : fuzz_generated_in_dir / '@0@_@1@'.format(name, fuzz_in)])
-                endforeach
-        endif
-endforeach
-
-alias_target('fuzzers', fuzzer_exes)
-
-############################################################
-
 subdir('docs/sysvinit')
 subdir('docs/var-log')
 subdir('hwdb.d')
@@ -2841,24 +2836,28 @@ foreach tuple : fuzz_sanitizers
                         exe = custom_target(
                                 name,
                                 output : name,
-                                depends : [build] + fuzz_generated_directives,
+                                depends : build,
                                 command : [ln, '-fs',
                                            build.full_path() / fuzzer,
                                            '@OUTPUT@'],
                                 build_by_default : true)
 
-                        foreach tuple : fuzz_ins
-                                fuzz_dir = tuple[0]
-                                fuzz_in = tuple[1]
-
-                                test('@0@_@1@_@2@'.format(fuzzer, fuzz_in, sanitizer),
+                        foreach directive : fuzz_ins.get('directives', [])
+                                test('@0@_@1@_@2@'.format(fuzzer, fs.name(directive.full_path()), sanitizer),
+                                     env,
+                                     suite : 'fuzz+san',
+                                     env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
+                                     timeout : 60,
+                                     args : [exe.full_path(), directive.full_path()],
+                                     depends : directive)
+                        endforeach
+                        foreach file : fuzz_ins.get('files', [])
+                                test('@0@_@1@_@2@'.format(fuzzer, fs.name(file), sanitizer),
                                      env,
                                      suite : 'fuzz+san',
                                      env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
                                      timeout : 60,
-                                     args : [exe.full_path(),
-                                             fuzz_dir != '' ? project_source_root / fuzz_dir / fuzzer / fuzz_in
-                                                            : fuzz_generated_in_dir / '@0@_@1@'.format(fuzzer, fuzz_in)])
+                                     args : [exe.full_path(), file])
                         endforeach
                 endforeach
         endif
index 7adcc178a6afb959af3a8e63bd0891daa853d597..05997744df5faa5441b2d84cc64ef4f32f726919 100644 (file)
@@ -24,6 +24,7 @@ if efi_arch != ''
                 ],
         }
         efi_test_template = test_template + efitest_base
+        efi_fuzz_template = fuzz_template + efitest_base
 
         executables += [
                 efi_test_template + {
@@ -34,19 +35,14 @@ if efi_arch != ''
                 efi_test_template + {
                         'sources' : files('test-efi-string.c'),
                 },
-        ]
-        fuzzers += [
-                {
+                efi_fuzz_template + {
                         'sources' : files('fuzz-bcd.c'),
-                        'base' : efitest_base,
                 },
-                {
+                efi_fuzz_template + {
                         'sources' : files('fuzz-efi-string.c'),
-                        'base' : efitest_base,
                 },
-                {
+                efi_fuzz_template + {
                         'sources' : files('fuzz-efi-printf.c'),
-                        'base' : efitest_base,
                 },
         ]
 endif
index a99136be0f9a38bafc23f8c6380789304ce09b82..395342d754aa22073eb8ca3480a25c1b359bccb0 100644 (file)
@@ -153,6 +153,21 @@ executables += [
                 ],
                 'dependencies' : libseccomp,
         },
+        fuzz_template + {
+                'sources' : files('fuzz-unit-file.c'),
+                'link_with' : [
+                        libcore,
+                        libshared
+                ],
+                'dependencies' : libmount,
+        },
+        fuzz_template + {
+                'sources' : files('fuzz-manager-serialize.c'),
+                'link_with' : [
+                        libcore,
+                        libshared
+                ],
+        },
 ]
 
 in_files = [['system.conf',                     pkgsysconfdir],
@@ -211,21 +226,3 @@ core_test_template = test_template + {
         'include_directories' : core_includes,
         'suite' : 'core',
 }
-
-fuzzers += [
-        {
-                'sources' : files('fuzz-unit-file.c'),
-                'link_with' : [
-                        libcore,
-                        libshared
-                ],
-                'dependencies' : libmount,
-        },
-        {
-                'sources' : files('fuzz-manager-serialize.c'),
-                'link_with' : [
-                        libcore,
-                        libshared
-                ],
-        },
-]
index 89419f1de17dfc03e44d2ac0381b146b6fe5fe14..e5a37466db84978ec6e38a80afab3441e09f48be 100644 (file)
@@ -81,6 +81,14 @@ executables += [
                 'sources' : systemd_journal_gatewayd_sources,
                 'dependencies' : common_deps + [libmicrohttpd],
         },
+        fuzz_template + {
+                'sources' : files('fuzz-journal-remote.c'),
+                'link_with' : [
+                        libshared,
+                        libsystemd_journal_remote,
+                ],
+                'include_directories' : journal_includes,
+        },
 ]
 
 in_files = [
@@ -112,16 +120,3 @@ if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
                                             chmod 755 $DESTDIR/var/log/journal/remote || :''')
         endif
 endif
-
-############################################################
-
-fuzzers += [
-        {
-                'sources' : files('fuzz-journal-remote.c'),
-                'link_with' : [
-                        libshared,
-                        libsystemd_journal_remote,
-                ],
-                'includes' : journal_includes,
-        },
-]
index 90170599a78b32fdbb24f292d0fbfc93d21276de..65adb2ccba48b255151d55027ce4cb629481acfd 100644 (file)
@@ -48,6 +48,14 @@ journal_test_template = test_template + {
         ],
 }
 
+journal_fuzz_template = fuzz_template + {
+        'link_with' : [
+                libjournal_core,
+                libshared,
+        ],
+        'dependencies' : libselinux,
+}
+
 executables += [
         libexec_template + {
                 'name' : 'systemd-journald',
@@ -124,81 +132,65 @@ executables += [
         journal_test_template + {
                 'sources' : files('test-journal.c'),
         },
-]
-
-if install_sysconfdir_samples
-        install_data('journald.conf',
-                     install_dir : pkgsysconfdir)
-endif
-
-if get_option('create-log-dirs')
-        meson.add_install_script(
-                'sh', '-c',
-                mkdir_p.format('/var/log/journal'))
-        meson.add_install_script(
-                'sh', '-c',
-                '''chown 0:0 $DESTDIR/var/log/journal &&
-                   chmod 755 $DESTDIR/var/log/journal || :''')
-        if get_option('adm-group')
-                meson.add_install_script(
-                        'sh', '-c',
-                        'setfacl -nm g:adm:rx,d:g:adm:rx $DESTDIR/var/log/journal || :')
-        endif
-        if get_option('wheel-group')
-                meson.add_install_script(
-                        'sh', '-c',
-                        'setfacl -nm g:wheel:rx,d:g:wheel:rx $DESTDIR/var/log/journal || :')
-        endif
-endif
-
-############################################################
-
-fuzzer_journald_base = {
-        'link_with' : [libjournal_core, libshared],
-        'dependencies' : [libselinux],
-}
-
-fuzzers += [
-        {
+        journal_fuzz_template + {
                 'sources' : files(
                         'fuzz-journald-audit.c',
                         'fuzz-journald.c',
                 ),
-                'base' : fuzzer_journald_base,
         },
-        {
+        journal_fuzz_template + {
                 'sources' : files(
                         'fuzz-journald-kmsg.c',
                         'fuzz-journald.c',
                 ),
-                'base' : fuzzer_journald_base,
         },
-        {
+        journal_fuzz_template + {
                 'sources' : files(
                         'fuzz-journald-native.c',
                         'fuzz-journald.c',
                 ),
-                'base' : fuzzer_journald_base,
         },
-        {
+        journal_fuzz_template + {
                 'sources' : files(
                         'fuzz-journald-native-fd.c',
                         'fuzz-journald.c',
                 ),
-                'base' : fuzzer_journald_base,
         },
-        {
+        journal_fuzz_template + {
                 'sources' : files(
                         'fuzz-journald-stream.c',
                         'fuzz-journald.c',
                 ),
-                'base' : fuzzer_journald_base,
         },
-        {
+        journal_fuzz_template + {
                 'sources' : files(
                         'fuzz-journald-syslog.c',
                         'fuzz-journald.c',
                 ),
-                'base' : fuzzer_journald_base,
         },
 ]
+
+if install_sysconfdir_samples
+        install_data('journald.conf',
+                     install_dir : pkgsysconfdir)
+endif
+
+if get_option('create-log-dirs')
+        meson.add_install_script(
+                'sh', '-c',
+                mkdir_p.format('/var/log/journal'))
+        meson.add_install_script(
+                'sh', '-c',
+                '''chown 0:0 $DESTDIR/var/log/journal &&
+                   chmod 755 $DESTDIR/var/log/journal || :''')
+        if get_option('adm-group')
+                meson.add_install_script(
+                        'sh', '-c',
+                        'setfacl -nm g:adm:rx,d:g:adm:rx $DESTDIR/var/log/journal || :')
+        endif
+        if get_option('wheel-group')
+                meson.add_install_script(
+                        'sh', '-c',
+                        'setfacl -nm g:wheel:rx,d:g:wheel:rx $DESTDIR/var/log/journal || :')
+        endif
+endif
index 74041f6abdc619133a9f3d8a6e9d22f65cf61b15..043d3bc2548b5fbe5725963f633bd589fc441b41 100644 (file)
@@ -47,6 +47,13 @@ network_test_template = test_template + {
         'suite' : 'network',
 }
 
+network_fuzz_template = fuzz_template + {
+        'link_with' : [
+                libshared,
+                libsystemd_network,
+        ],
+}
+
 executables += [
         network_test_template + {
                 'sources' : files('test-acd.c'),
@@ -83,35 +90,22 @@ executables += [
         network_test_template + {
                 'sources' : files('test-sd-dhcp-lease.c'),
         },
-]
-
-fuzzer_network_base = {
-        'link_with' : [libshared, libsystemd_network],
-}
-
-fuzzers += [
-        {
+        network_fuzz_template + {
                 'sources' : files('fuzz-dhcp-client.c'),
-                'base' : fuzzer_network_base,
         },
-        {
+        network_fuzz_template + {
                 'sources' : files('fuzz-dhcp6-client.c'),
-                'base' : fuzzer_network_base,
         },
-        {
+        network_fuzz_template + {
                 'sources' : files('fuzz-dhcp-server.c'),
-                'base' : fuzzer_network_base,
         },
-        {
+        network_fuzz_template + {
                 'sources' : files('fuzz-dhcp-server-relay.c'),
-                'base' : fuzzer_network_base,
         },
-        {
+        network_fuzz_template + {
                 'sources' : files('fuzz-lldp-rx.c'),
-                'base' : fuzzer_network_base,
         },
-        {
+        network_fuzz_template + {
                 'sources' : files('fuzz-ndisc-rs.c'),
-                'base' : fuzzer_network_base,
         },
 ]
index c5607a9b311baacf786114f57d22ce0c4a827753..7d0e5d63457415bd8accf805de5e604a2ba43884 100644 (file)
@@ -114,6 +114,9 @@ network_generator_sources = files(
         'generator/network-generator.c',
 )
 
+networkd_network_gperf_gperf = files('networkd-network-gperf.gperf')
+networkd_netdev_gperf_gperf = files('netdev/netdev-gperf.gperf')
+
 sources += custom_target(
         'networkd-gperf.c',
         input : 'networkd-gperf.gperf',
@@ -122,13 +125,13 @@ sources += custom_target(
 
 sources += custom_target(
         'networkd-network-gperf.c',
-        input : 'networkd-network-gperf.gperf',
+        input : networkd_network_gperf_gperf,
         output : 'networkd-network-gperf.c',
         command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
 
 sources += custom_target(
         'netdev-gperf.c',
-        input : 'netdev/netdev-gperf.gperf',
+        input : networkd_netdev_gperf_gperf,
         output : 'netdev-gperf.c',
         command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
 
@@ -158,6 +161,15 @@ network_test_template = test_template + {
         'include_directories' : network_includes,
 }
 
+network_fuzz_template = fuzz_template + {
+        'link_with' : [
+                libnetworkd_core,
+                libsystemd_network,
+        ],
+        'dependencies' : threads,
+        'include_directories' : network_includes,
+}
+
 executables += [
         libexec_template + {
                 'name' : 'systemd-networkd',
@@ -221,6 +233,12 @@ executables += [
         network_test_template + {
                 'sources' : files('test-networkd-util.c'),
         },
+        network_fuzz_template + {
+                'sources' : files('fuzz-netdev-parser.c'),
+        },
+        network_fuzz_template + {
+                'sources' : files('fuzz-network-parser.c'),
+        },
 ]
 
 if conf.get('ENABLE_NETWORKD') == 1
@@ -244,20 +262,3 @@ if conf.get('ENABLE_NETWORKD') == 1
                              install_dir : pkgsysconfdir)
         endif
 endif
-
-fuzzer_network_base = {
-        'link_with' : [libnetworkd_core, libsystemd_network, networkd_link_with],
-        'dependencies' : threads,
-        'includes' : network_includes,
-}
-
-fuzzers += [
-        {
-                'sources' : files('fuzz-netdev-parser.c'),
-                'base' : fuzzer_network_base,
-        },
-        {
-                'sources' : files('fuzz-network-parser.c'),
-                'base' : fuzzer_network_base,
-        },
-]
index b6628c6751583c832eb78bbc960281fbac430bd0..e2605f895bbfd06689e04f03ef656656b7a5a11a 100644 (file)
@@ -45,6 +45,7 @@ nspawn_common_template = {
         'dependencies' : libseccomp,
 }
 nspawn_test_template = test_template + nspawn_common_template
+nspawn_fuzz_template = fuzz_template + nspawn_common_template
 
 executables += [
         executable_template + {
@@ -69,20 +70,10 @@ executables += [
                 'dependencies' : libacl,
                 'type' : 'manual',
         },
-]
-
-fuzzer_nspawn_base = {
-        'link_with' : [libshared, libnspawn_core],
-        'dependencies' : libseccomp
-}
-
-fuzzers += [
-        {
+        nspawn_fuzz_template + {
                 'sources' : files('fuzz-nspawn-settings.c'),
-                'base' : fuzzer_nspawn_base,
         },
-        {
+        nspawn_fuzz_template + {
                 'sources' : files('fuzz-nspawn-oci.c'),
-                'base' : fuzzer_nspawn_base,
         },
 ]
index e8881fb3b3b5430f43ca462e88bbd314949a581c..5b4e583501eccb7f2caf8853bfed16f1a406db3f 100644 (file)
@@ -134,6 +134,7 @@ resolve_common_template = {
         ],
 }
 resolve_test_template = test_template + resolve_common_template
+resolve_fuzz_template = fuzz_template + resolve_common_template
 
 executables += [
         libexec_template + {
@@ -195,6 +196,18 @@ executables += [
                 ],
                 'include_directories' : resolve_includes,
         },
+        resolve_fuzz_template + {
+                'sources' : files('fuzz-dns-packet.c'),
+        },
+        resolve_fuzz_template + {
+                'sources' : files(
+                        'fuzz-etc-hosts.c',
+                        'resolved-etc-hosts.c',
+                ),
+        },
+        resolve_fuzz_template + {
+                'sources' : files('fuzz-resource-record.c'),
+        },
 ]
 
 if conf.get('ENABLE_RESOLVE') == 1
@@ -223,28 +236,3 @@ custom_target(
         command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@'],
         install : conf.get('ENABLE_RESOLVE') == 1 and install_sysconfdir_samples,
         install_dir : pkgsysconfdir)
-
-############################################################
-
-fuzzer_resolve_base = {
-        'link_with' : [libsystemd_resolve_core, libshared],
-        'dependencies' : [lib_openssl_or_gcrypt, libm],
-}
-
-fuzzers += [
-        {
-                'sources' : files('fuzz-dns-packet.c'),
-                'base' : fuzzer_resolve_base,
-        },
-        {
-                'sources' : files(
-                        'fuzz-etc-hosts.c',
-                        'resolved-etc-hosts.c',
-                ),
-                'base' : fuzzer_resolve_base,
-        },
-        {
-                'sources' : files('fuzz-resource-record.c'),
-                'base' : fuzzer_resolve_base,
-        },
-]
index e7e1a1964b9800580dfdaeb8ac7d2672ee40f5fe..bc08b8672f4ec1a59a773d1a423a4e49bedcc6bb 100644 (file)
@@ -63,6 +63,14 @@ executables += [
                         threads,
                 ],
         },
+        fuzz_template + {
+                'sources' : [
+                        files('fuzz-systemctl-parse-argv.c'),
+                        systemctl_sources,
+                ],
+                'link_with' : systemctl_link_with,
+                'c_args' : ['-DFUZZ_SYSTEMCTL_PARSE_ARGV'],
+        },
 ]
 
 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
@@ -71,14 +79,3 @@ foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
                                  bindir / 'systemctl',
                                  sbindir / alias)
 endforeach
-
-fuzzers += [
-        {
-                'sources' : [
-                        files('fuzz-systemctl-parse-argv.c'),
-                        systemctl_sources,
-                ],
-                'link_with' : systemctl_link_with,
-                'c_args' : '-DFUZZ_SYSTEMCTL_PARSE_ARGV',
-        },
-]
index b99e313722185a3d187a98e3de54bfac584b4fe0..200cc055462ed7329eb241630a063b877742a594 100644 (file)
@@ -84,9 +84,11 @@ keyboard_keys_from_name_h = custom_target(
 
 ############################################################
 
+udev_link_gperf_gperf = files('net/link-config-gperf.gperf')
+
 link_config_gperf_c = custom_target(
         'link-config-gperf.c',
-        input : 'net/link-config-gperf.gperf',
+        input : udev_link_gperf_gperf,
         output : 'link-config-gperf.c',
         command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
 
@@ -142,6 +144,7 @@ udev_common_template = {
         ],
 }
 udev_test_template = test_template + udev_common_template
+udev_fuzz_template = fuzz_template + udev_common_template
 
 executables += [
         executable_template + {
@@ -226,6 +229,22 @@ executables += [
         udev_test_template + {
                 'sources' : files('test-udev-spawn.c'),
         },
+        fuzz_template + {
+                'sources' : files(
+                        'fido_id/fuzz-fido-id-desc.c',
+                        'fido_id/fido_id_desc.c',
+                ),
+        },
+        udev_fuzz_template + {
+                'sources' : files('net/fuzz-link-parser.c'),
+                'include_directories' : udev_includes,
+        },
+        udev_fuzz_template + {
+                'sources' : files('fuzz-udev-rule-parse-value.c'),
+        },
+        udev_fuzz_template + {
+                'sources' : files('fuzz-udev-rules.c'),
+        },
 ]
 
 meson.add_install_script(meson_make_symlink,
@@ -252,30 +271,3 @@ if install_sysconfdir
         meson.add_install_script('sh', '-c',
                                  mkdir_p.format(sysconfdir / 'udev/rules.d'))
 endif
-
-fuzzer_udev_base = {
-        'link_with' : [libudevd_core, libshared],
-        'dependencies' : [threads, libacl],
-}
-
-fuzzers += [
-        {
-                'sources' : files('net/fuzz-link-parser.c'),
-                'includes' : udev_includes,
-                'base' : fuzzer_udev_base,
-        },
-        {
-                'sources' : files('fuzz-udev-rule-parse-value.c'),
-                'base' : fuzzer_udev_base,
-        },
-        {
-                'sources' : files('fuzz-udev-rules.c'),
-                'base' : fuzzer_udev_base,
-        },
-        {
-                'sources' : files(
-                        'fido_id/fuzz-fido-id-desc.c',
-                        'fido_id/fido_id_desc.c',
-                ),
-        },
-]
index 238dde8fd0754d80639ff21860d9403f923d6953..c938932c6215415571cb6f03214095e0ea8d29c4 100644 (file)
@@ -23,10 +23,7 @@ executables += [
                         'xdg-autostart-service.c',
                 ),
         },
-]
-
-fuzzers += [
-        {
+        fuzz_template + {
                 'sources' : files(
                         'fuzz-xdg-desktop.c',
                         'xdg-autostart-service.c',
index 5e8481354cdb273f9df9c6b318267bb79be03496..11b91e30bb6921de74b0a801e1c587b8b8193864 100644 (file)
@@ -1,32 +1,38 @@
 # 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 = []
+fuzz_regression_tests = {}
 
-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'],
+directives = [['fuzz-network-parser', 'directives.network', networkd_network_gperf_gperf],
+              ['fuzz-netdev-parser', 'directives.netdev',   networkd_netdev_gperf_gperf],
+              ['fuzz-link-parser', 'directives.link',       udev_link_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])],
+        directive = custom_target(
+                tuple[1],
+                output: tuple[1],
+                command: [generate_directives_py, tuple[2]],
                 capture: true)
+
+        dict = { 'directives' : [directive] }
+        fuzz_regression_tests += { tuple[0] : dict }
 endforeach
 
+unit_directives = []
 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),
+        name = 'directives.@0@'.format(unit_type)
+        unit_directives += custom_target(
+                name,
+                output: name,
                 command: [generate_directives_py, load_fragment_gperf_gperf, sec_rx, unit_type],
                 capture: true)
 endforeach
+dict = { 'directives' : unit_directives }
+fuzz_regression_tests += { 'fuzz-unit-file' : dict }
 
 ############################################################
 
@@ -58,21 +64,6 @@ else
         out = run_command(sh, '-c', 'cd "@0@"; echo @1@/*/*'.format(project_source_root, fuzz_testsdir), check: true)
 endif
 
-# 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 ''.
@@ -84,11 +75,8 @@ foreach p : out.stdout().split()
         endif
         fuzzer = fs.name(fs.parent(p))
         fuzz_in = fs.name(p)
-        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}
+
+        dict = fuzz_regression_tests.get(fuzzer, {})
+        dict += { 'files' : dict.get('files', []) + files(fuzzer / fuzz_in) }
+        fuzz_regression_tests += { fuzzer : dict }
 endforeach
index a5bcc128ccb568b65ce21e4e00a4e855f7104771..59d9a63a11d373532e3460e3aad017ae1ea3a47a 100644 (file)
@@ -309,7 +309,3 @@ if want_tests != 'false' and conf.get('ENABLE_KERNEL_INSTALL') == 1
              args : args,
              depends : deps)
 endif
-
-############################################################
-
-subdir('fuzz')