From ffe5aba60c970ae0a01285215a200b042a6203ff Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 20 Jun 2023 18:30:40 +0200 Subject: [PATCH] analyze: also check for version string validity It's highly interesting to see if tools such as systemd-sysupdate consider a version valid, hence let's output that too (though gracefully, not fatally) --- src/analyze/analyze-compare-versions.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/analyze/analyze-compare-versions.c b/src/analyze/analyze-compare-versions.c index 07b52a55f2e..d210fab672a 100644 --- a/src/analyze/analyze-compare-versions.c +++ b/src/analyze/analyze-compare-versions.c @@ -9,17 +9,26 @@ #include "strv.h" int verb_compare_versions(int argc, char *argv[], void *userdata) { + const char *v1 = ASSERT_PTR(argv[1]), *v2 = ASSERT_PTR(argv[argc-1]); int r; assert(IN_SET(argc, 3, 4)); assert(argv); + /* We only output a warning on invalid version strings (instead of failing), since the comparison + * functions try to handle invalid strings graceful and it's still interesting to see what the + * comparison result will be. */ + if (!version_is_valid(v1)) + log_warning("Version string 1 is not valid, comparing anyway: %s", v1); + if (!version_is_valid(v2)) + log_warning("Version string 2 is not valid, comparing anyway: %s", v2); + if (argc == 3) { - r = strverscmp_improved(ASSERT_PTR(argv[1]), ASSERT_PTR(argv[2])); + r = strverscmp_improved(v1, v2); printf("%s %s %s\n", - isempty(argv[1]) ? "''" : argv[1], + isempty(v1) ? "''" : v1, comparison_operator(r), - isempty(argv[2]) ? "''" : argv[2]); + isempty(v2) ? "''" : v2); /* This matches the exit convention used by rpmdev-vercmp. * We don't use named values because 11 and 12 don't have names. */ @@ -28,12 +37,13 @@ int verb_compare_versions(int argc, char *argv[], void *userdata) { } else { const char *op = ASSERT_PTR(argv[2]); CompareOperator operator; + assert(argc == 4); operator = parse_compare_operator(&op, COMPARE_ALLOW_TEXTUAL); if (operator < 0 || !isempty(op)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown operator \"%s\".", op); - r = version_or_fnmatch_compare(operator, ASSERT_PTR(argv[1]), ASSERT_PTR(argv[3])); + r = version_or_fnmatch_compare(operator, v1, v2); if (r < 0) return log_error_errno(r, "Failed to compare versions: %m"); -- 2.47.3