1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-10 05:18:17 +03:00

conf-parser: several cleanups for DEFINE_CONFIG_PARSE_ENUMV() macro

- use GREEDY_REALLOC() and FOREACH_ARRAY(),
- do not set an array with only terminating 'invalid' value.

Note, this macro is only used by parsing NamePolicy= and AlternativeNamesPolicy=
in .link files. and udevd correctly handles both an empty array and an
array with only 'invalid'. Hence, this does not change any behavior.
This commit is contained in:
Yu Watanabe 2024-09-02 06:11:32 +09:00
parent 42efe5be1d
commit 3c8dc3a3e0

View File

@ -384,22 +384,14 @@ typedef enum ConfigParseStringFlags {
CONFIG_PARSER_PROTOTYPE(function) { \ CONFIG_PARSER_PROTOTYPE(function) { \
type **enums = ASSERT_PTR(data); \ type **enums = ASSERT_PTR(data); \
_cleanup_free_ type *xs = NULL; \ _cleanup_free_ type *xs = NULL; \
size_t i = 0; \ size_t n = 0; \
int r; \ int r; \
\ \
assert(filename); \
assert(lvalue); \ assert(lvalue); \
assert(rvalue); \
\
xs = new0(type, 1); \
if (!xs) \
return -ENOMEM; \
\
*xs = invalid; \
\ \
for (const char *p = rvalue;;) { \ for (const char *p = rvalue;;) { \
_cleanup_free_ char *en = NULL; \ _cleanup_free_ char *en = NULL; \
type x, *new_xs; \ type x; \
\ \
r = extract_first_word(&p, &en, NULL, 0); \ r = extract_first_word(&p, &en, NULL, 0); \
if (r < 0) \ if (r < 0) \
@ -415,27 +407,33 @@ typedef enum ConfigParseStringFlags {
continue; \ continue; \
} \ } \
\ \
for (type *ys = xs; x != invalid && *ys != invalid; ys++) \ FOREACH_ARRAY(i, xs, n) \
if (*ys == x) { \ if (*i == x) { \
log_syntax(unit, LOG_NOTICE, filename, line, 0, \ log_syntax(unit, LOG_NOTICE, filename, line, 0, \
"Duplicate entry %s in %s=, ignoring.", \ "Duplicate entry %s in %s=, ignoring.", \
en, lvalue); \ en, lvalue); \
x = invalid; \ x = invalid; \
break; \
} \ } \
\ \
if (x == invalid) \ if (x == invalid) \
continue; \ continue; \
\ \
*(xs + i) = x; \ /* Allocate one more for the trailing 'invalid'. */ \
new_xs = realloc(xs, (++i + 1) * sizeof(type)); \ if (!GREEDY_REALLOC(xs, n + 2)) \
if (new_xs) \
xs = new_xs; \
else \
return log_oom(); \ return log_oom(); \
\ \
*(xs + i) = invalid; \ xs[n++] = x; \
} \ } \
\ \
if (n <= 0) { \
/* An empty string, or invalid values only. */ \
*enums = mfree(*enums); \
return 1; \
} \
\
/* Terminate with 'invalid' */ \
xs[n] = invalid; \
free_and_replace(*enums, xs); \ free_and_replace(*enums, xs); \
return 1; \ return 1; \
} }