1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "conf-parser.h"
8 #include "load-fragment.h"
9 #include "string-util.h"
12 int LLVMFuzzerTestOneInput(const uint8_t *data
, size_t size
) {
13 _cleanup_free_
char *out
= NULL
; /* out should be freed after g */
15 _cleanup_fclose_
FILE *f
= NULL
, *g
= NULL
;
16 _cleanup_free_
char *p
= NULL
;
18 _cleanup_(manager_freep
) Manager
*m
= NULL
;
26 f
= fmemopen((char*) data
, size
, "re");
29 if (read_line(f
, LINE_MAX
, &p
) < 0)
32 t
= unit_type_from_string(p
);
36 if (!unit_vtable
[t
]->load
)
40 assert_se(offset
>= 0);
43 _cleanup_free_
char *l
= NULL
;
46 if (read_line(f
, LONG_LINE_MAX
, &l
) <= 0)
49 ll
= l
+ strspn(l
, WHITESPACE
);
51 if (startswith(ll
, "ListenNetlink=")) {
52 /* ListenNetlink causes a false positive in msan,
53 * let's skip this for now. */
54 log_notice("Skipping test because ListenNetlink= is present");
59 assert_se(fseek(f
, offset
, SEEK_SET
) == 0);
61 /* We don't want to fill the logs with messages about parse errors.
62 * Disable most logging if not running standalone */
63 if (!getenv("SYSTEMD_LOG_LEVEL"))
64 log_set_max_level(LOG_CRIT
);
66 assert_se(manager_new(UNIT_FILE_SYSTEM
, MANAGER_TEST_RUN_MINIMAL
, &m
) >= 0);
68 name
= strjoina("a.", unit_type_to_string(t
));
69 assert_se(unit_new_for_name(m
, unit_vtable
[t
]->object_size
, name
, &u
) >= 0);
71 (void) config_parse(name
, name
, f
,
72 UNIT_VTABLE(u
)->sections
,
73 config_item_perf_lookup
, load_fragment_gperf_lookup
,
74 CONFIG_PARSE_ALLOW_INCLUDE
, u
);
76 g
= open_memstream(&out
, &out_size
);