* networkd: condition_test() can return a negative error, handle that

If a condition check fails with an error we should not consider the check
successful. Fix that.

We should probably also improve logging in this case, but for now, let's just
unbreak this breakage.

Fixes: #3236

* condition: handle unrecognized architectures nicer

When we encounter a check for an architecture we don't know we should not
let the condition check fail with an error code, but instead simply return
false. After all the architecture might just be newer than the ones we know, in
which case it's certainly not our local one.

Fixes: #3236
This commit is contained in:
Lennart Poettering
2016-06-30 15:56:23 -07:00
committed by GitHub
parent f15461b2b2
commit 2cb623954f
3 changed files with 11 additions and 10 deletions
+4 -4
View File
@@ -102,16 +102,16 @@ bool net_match_config(const struct ether_addr *match_mac,
const char *dev_type,
const char *dev_name) {
if (match_host && !condition_test(match_host))
if (match_host && condition_test(match_host) <= 0)
return false;
if (match_virt && !condition_test(match_virt))
if (match_virt && condition_test(match_virt) <= 0)
return false;
if (match_kernel && !condition_test(match_kernel))
if (match_kernel && condition_test(match_kernel) <= 0)
return false;
if (match_arch && !condition_test(match_arch))
if (match_arch && condition_test(match_arch) <= 0)
return false;
if (match_mac && (!dev_mac || memcmp(match_mac, dev_mac, ETH_ALEN)))
+4 -3
View File
@@ -182,10 +182,11 @@ static int condition_test_architecture(Condition *c) {
if (streq(c->parameter, "native"))
b = native_architecture();
else
else {
b = architecture_from_string(c->parameter);
if (b < 0)
return b;
if (b < 0) /* unknown architecture? Then it's definitely not ours */
return false;
}
return a == b;
}
+3 -3
View File
@@ -159,15 +159,15 @@ static void test_condition_test_architecture(void) {
assert_se(sa);
condition = condition_new(CONDITION_ARCHITECTURE, sa, false, false);
assert_se(condition_test(condition));
assert_se(condition_test(condition) > 0);
condition_free(condition);
condition = condition_new(CONDITION_ARCHITECTURE, "garbage value", false, false);
assert_se(condition_test(condition) < 0);
assert_se(condition_test(condition) == 0);
condition_free(condition);
condition = condition_new(CONDITION_ARCHITECTURE, sa, false, true);
assert_se(!condition_test(condition));
assert_se(condition_test(condition) == 0);
condition_free(condition);
}