From: Frantisek Sumsal Date: Thu, 12 Oct 2023 13:44:34 +0000 (+0200) Subject: test: add a fuzzer for the varlink IDL stuff X-Git-Tag: v255-rc1~236^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=13de7c7e66a6d5c00d120afa84a7c44ffb3a5581;p=thirdparty%2Fsystemd.git test: add a fuzzer for the varlink IDL stuff --- diff --git a/src/fuzz/fuzz-varlink-idl.c b/src/fuzz/fuzz-varlink-idl.c new file mode 100644 index 00000000000..cefc49219cf --- /dev/null +++ b/src/fuzz/fuzz-varlink-idl.c @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include + +#include "errno-util.h" +#include "fd-util.h" +#include "fuzz.h" +#include "io-util.h" +#include "varlink-idl.h" +#include "log.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + _cleanup_(varlink_interface_freep) VarlinkInterface *vi = NULL; + _cleanup_free_ char *str = NULL, *dump = NULL; + int r; + + log_set_max_level(LOG_CRIT); + log_parse_environment(); + (void) log_open(); + + assert_se(str = memdup_suffix0(data, size)); + + r = varlink_idl_parse(str, /* line= */ NULL, /* column= */ NULL, &vi); + if (r < 0) { + log_debug_errno(r, "Failed to parse varlink interface definition: %m"); + return 0; + } + + assert_se(varlink_idl_format(vi, &dump) >= 0); + (void) varlink_idl_consistent(vi, LOG_DEBUG); + + return 0; +} diff --git a/src/fuzz/meson.build b/src/fuzz/meson.build index 02a722edb1e..8c1b2e91ea0 100644 --- a/src/fuzz/meson.build +++ b/src/fuzz/meson.build @@ -12,4 +12,5 @@ simple_fuzzers += files( 'fuzz-time-util.c', 'fuzz-udev-database.c', 'fuzz-varlink.c', + 'fuzz-varlink-idl.c', ) diff --git a/test/fuzz/fuzz-varlink-idl/interface1 b/test/fuzz/fuzz-varlink-idl/interface1 new file mode 100644 index 00000000000..eea873dc9f6 --- /dev/null +++ b/test/fuzz/fuzz-varlink-idl/interface1 @@ -0,0 +1,100 @@ +# https://varlink.org/Interface-Definition +interface org.foo.bar + +type MyOtherType( + x: T +) + +type T ( x: TT ) +type TT ( x: TTT ) +type TTT ( x: TTTT ) +type TTTT ( x: TTTTT ) +type TTTTT ( x: TTTTTT ) +type TTTTTT ( x: TTTTTTT ) +type TTTTTTT ( x: TTTTTTTT ) +type TTTTTTTT ( x: TTTTTTTTT ) +type TTTTTTTTT ( x: TTTTTTTTTT ) +type TTTTTTTTTT ( x: TTTTTTTTTTT ) +type TTTTTTTTTTT ( x: TTTTTTTTTTTT ) +type TTTTTTTTTTTT ( x: TTTTTTTTTTTTT ) +type TTTTTTTTTTTTT ( x: TTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ) +type TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ( x: bool ) + +type MyType ( + example_bool: bool, + example_int: int, + example_float: float, + example_string: string, + example_object: object, + example_enum_single: (one), + example_enum: (one, two, three), + example_struct_single: (first: int), + example_struct: (first: int, second: string), + example_array: []string, + example_dictionary: [string]string, + example_stringset: [string](a, b, c), + example_stringset2: [string](a: int, b: bool, c: object), + example_nullable: ?string, + example_nullable_array_struct: ?[](first: int, second: string), + example_other_type: MyOtherType +) + +method Foo(a: int, b: MyType) -> (bar: []string, baz: float, more: (i: int, f: float, s: string)) +method VoidArgs() -> (a: int) +method VoidRet(a: int) -> () +method Void() -> () + +error UnknownAction(action: string, more_data: ?string) +error VoidError()