summaryrefslogtreecommitdiffstats
path: root/src/shared/conf-parser.h
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2024-09-01 23:11:32 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2024-09-01 23:11:50 +0200
commit3c8dc3a3e0023fe347c7b513a3fc560530bee273 (patch)
tree6110ee904d853053db3a633c4cc689f641dbc93d /src/shared/conf-parser.h
parenttree-wide: drop msg argument for DEFINE_CONFIG_PARSE() macro and friends (diff)
downloadsystemd-3c8dc3a3e0023fe347c7b513a3fc560530bee273.tar.xz
systemd-3c8dc3a3e0023fe347c7b513a3fc560530bee273.zip
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.
Diffstat (limited to '')
-rw-r--r--src/shared/conf-parser.h34
1 files changed, 16 insertions, 18 deletions
diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h
index 3e00666e77..89870ccffc 100644
--- a/src/shared/conf-parser.h
+++ b/src/shared/conf-parser.h
@@ -384,22 +384,14 @@ typedef enum ConfigParseStringFlags {
CONFIG_PARSER_PROTOTYPE(function) { \
type **enums = ASSERT_PTR(data); \
_cleanup_free_ type *xs = NULL; \
- size_t i = 0; \
+ size_t n = 0; \
int r; \
\
- assert(filename); \
assert(lvalue); \
- assert(rvalue); \
- \
- xs = new0(type, 1); \
- if (!xs) \
- return -ENOMEM; \
- \
- *xs = invalid; \
\
for (const char *p = rvalue;;) { \
_cleanup_free_ char *en = NULL; \
- type x, *new_xs; \
+ type x; \
\
r = extract_first_word(&p, &en, NULL, 0); \
if (r < 0) \
@@ -415,27 +407,33 @@ typedef enum ConfigParseStringFlags {
continue; \
} \
\
- for (type *ys = xs; x != invalid && *ys != invalid; ys++) \
- if (*ys == x) { \
+ FOREACH_ARRAY(i, xs, n) \
+ if (*i == x) { \
log_syntax(unit, LOG_NOTICE, filename, line, 0, \
"Duplicate entry %s in %s=, ignoring.", \
en, lvalue); \
x = invalid; \
+ break; \
} \
\
if (x == invalid) \
continue; \
\
- *(xs + i) = x; \
- new_xs = realloc(xs, (++i + 1) * sizeof(type)); \
- if (new_xs) \
- xs = new_xs; \
- else \
+ /* Allocate one more for the trailing 'invalid'. */ \
+ if (!GREEDY_REALLOC(xs, n + 2)) \
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); \
return 1; \
}