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