summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/shared/condition-util.c51
-rw-r--r--src/test/test-condition-util.c13
2 files changed, 35 insertions, 29 deletions
diff --git a/src/shared/condition-util.c b/src/shared/condition-util.c
index ff4a8ecd15..026b6a8712 100644
--- a/src/shared/condition-util.c
+++ b/src/shared/condition-util.c
@@ -74,12 +74,10 @@ void condition_free_list(Condition *first) {
}
bool condition_test_kernel_command_line(Condition *c) {
- char *line, *word = NULL;
- const char *w, *state;
+ _cleanup_free_ char *line = NULL;
+ const char *p;
bool equal;
int r;
- size_t l, pl;
- bool found = false;
assert(c);
assert(c->parameter);
@@ -92,35 +90,30 @@ bool condition_test_kernel_command_line(Condition *c) {
return c->negate;
equal = !!strchr(c->parameter, '=');
- pl = strlen(c->parameter);
-
- FOREACH_WORD_QUOTED(w, l, line, state) {
-
- free(word);
- word = strndup(w, l);
- if (!word)
- break;
-
- if (equal) {
- if (streq(word, c->parameter)) {
- found = true;
- break;
- }
- } else {
- if (startswith(word, c->parameter) && (word[pl] == '=' || word[pl] == 0)) {
- found = true;
- break;
- }
+ p = line;
+
+ for (;;) {
+ _cleanup_free_ char *word = NULL;
+ bool found;
+
+ r = unquote_first_word(&p, &word);
+ if (r <= 0)
+ return c->negate;
+
+ if (equal)
+ found = streq(word, c->parameter);
+ else {
+ const char *f;
+
+ f = startswith(word, c->parameter);
+ found = f && (*f == '=' || *f == 0);
}
+ if (found)
+ return !c->negate;
}
- if (!isempty(state))
- log_warning("Trailing garbage and the end of kernel commandline, ignoring.");
-
- free(word);
- free(line);
- return found == !c->negate;
+ return c->negate;
}
bool condition_test_virtualization(Condition *c) {
diff --git a/src/test/test-condition-util.c b/src/test/test-condition-util.c
index 35ee9167bf..1c792446af 100644
--- a/src/test/test-condition-util.c
+++ b/src/test/test-condition-util.c
@@ -95,6 +95,18 @@ static void test_condition_test_architecture(void) {
condition_free(condition);
}
+static void test_condition_test_kernel_command_line(void) {
+ Condition *condition;
+
+ condition = condition_new(CONDITION_KERNEL_COMMAND_LINE, "thisreallyshouldntbeonthekernelcommandline", false, false);
+ assert_se(!condition_test_kernel_command_line(condition));
+ condition_free(condition);
+
+ condition = condition_new(CONDITION_KERNEL_COMMAND_LINE, "andthis=neither", false, false);
+ assert_se(!condition_test_kernel_command_line(condition));
+ condition_free(condition);
+}
+
int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
@@ -102,6 +114,7 @@ int main(int argc, char *argv[]) {
test_condition_test_ac_power();
test_condition_test_host();
test_condition_test_architecture();
+ test_condition_test_kernel_command_line();
return 0;
}