From 1dc042ae12be9aa0a834eba7747f78079d06fcde Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Aug 2022 10:36:45 +0200 Subject: [PATCH 1/2] condition: check for last not first ')' in firmware test expressions I possess a machine with ')' in its BIOS version string, which will cause the current parser to mistake it as the closing ')' of the smbios-fields() expression. Let's make sure we always fo for the last, not the first ')', hence. --- src/shared/condition.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/condition.c b/src/shared/condition.c index 3a09b493fc..5c6e383679 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -659,7 +659,7 @@ static int condition_test_firmware(Condition *c, char **env) { _cleanup_free_ char *dtc_arg = NULL; char *end; - end = strchr(arg, ')'); + end = strrchr(arg, ')'); if (!end || *(end + 1) != '\0') { log_debug("Malformed ConditionFirmware=%s", c->parameter); return false; @@ -676,7 +676,7 @@ static int condition_test_firmware(Condition *c, char **env) { _cleanup_free_ char *smbios_arg = NULL; char *end; - end = strchr(arg, ')'); + end = strrchr(arg, ')'); if (!end || *(end + 1) != '\0') return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Malformed ConditionFirmware=%s: %m", c->parameter); From acd3c8662465c1f36c0c0fc974584694928d9234 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Aug 2022 10:37:59 +0200 Subject: [PATCH 2/2] test: don't accept failure as succes --- src/test/test-condition.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/test-condition.c b/src/test/test-condition.c index 6cb889c8d6..882b376f6f 100644 --- a/src/test/test-condition.c +++ b/src/test/test-condition.c @@ -362,13 +362,13 @@ TEST(condition_test_firmware_smbios_field) { expression = strjoina("smbios-field(bios_vendor =$ ", quote, bios_vendor, quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); expression = strjoina("smbios-field(bios_vendor=$", quote, bios_vendor, quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); expression = strjoina("smbios-field(bios_vendor !=$ ", quote, bios_vendor, quote, ")"); @@ -386,7 +386,7 @@ TEST(condition_test_firmware_smbios_field) { expression = strjoina("smbios-field(bios_vendor =$ ", quote, bios_vendor, "*", quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); /* Test version comparison with bios_version, if available */ @@ -402,7 +402,7 @@ TEST(condition_test_firmware_smbios_field) { expression = strjoina("smbios-field(bios_version = ", quote, bios_version, quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); expression = strjoina("smbios-field(bios_version != ", quote, bios_version, quote, ")"); @@ -414,19 +414,19 @@ TEST(condition_test_firmware_smbios_field) { expression = strjoina("smbios-field(bios_version <= ", quote, bios_version, quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); expression = strjoina("smbios-field(bios_version >= ", quote, bios_version, quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); expression = strjoina("smbios-field(bios_version < ", quote, bios_version, ".1", quote, ")"); condition = condition_new(CONDITION_FIRMWARE, expression, false, false); assert_se(condition); - assert_se(condition_test(condition, environ)); + assert_se(condition_test(condition, environ) > 0); condition_free(condition); expression = strjoina("smbios-field(bios_version > ", quote, bios_version, ".1", quote, ")");