This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/674-improve-properties
in repository https://gitbox.apache.org/repos/asf/celix.git

commit abb645669572ea16c5e9332ca31cb2f84c6388f3
Author: Pepijn Noltes <[email protected]>
AuthorDate: Mon Jan 22 18:35:36 2024 +0100

    Fix parse error in celix_version_parse
---
 libs/utils/gtest/src/VersionTestSuite.cc | 12 ++++++++++++
 libs/utils/src/version.c                 |  6 +++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/libs/utils/gtest/src/VersionTestSuite.cc 
b/libs/utils/gtest/src/VersionTestSuite.cc
index 6d650b57..df3668ec 100644
--- a/libs/utils/gtest/src/VersionTestSuite.cc
+++ b/libs/utils/gtest/src/VersionTestSuite.cc
@@ -355,4 +355,16 @@ TEST_F(VersionTestSuite, ParseTest) {
     parseStatus = celix_version_parse("invalid", &result);
     EXPECT_EQ(CELIX_ILLEGAL_ARGUMENT, parseStatus);
     EXPECT_EQ(nullptr, result);
+
+    parseStatus = celix_version_parse("-1", &result);
+    EXPECT_EQ(CELIX_ILLEGAL_ARGUMENT, parseStatus);
+    EXPECT_EQ(nullptr, result);
+
+    parseStatus = celix_version_parse("1.-2", &result);
+    EXPECT_EQ(CELIX_ILLEGAL_ARGUMENT, parseStatus);
+    EXPECT_EQ(nullptr, result);
+
+    parseStatus = celix_version_parse("1.2.-3", &result);
+    EXPECT_EQ(CELIX_ILLEGAL_ARGUMENT, parseStatus);
+    EXPECT_EQ(nullptr, result);
 }
diff --git a/libs/utils/src/version.c b/libs/utils/src/version.c
index 31423401..92d53001 100644
--- a/libs/utils/src/version.c
+++ b/libs/utils/src/version.c
@@ -196,8 +196,12 @@ celix_status_t celix_version_parse(const char *versionStr, 
celix_version_t** ver
     while (token) {
         bool convertedToLong = false;
         long l = celix_utils_convertStringToLong(token, 0L, &convertedToLong);
-        if (!convertedToLong && count == 3) { //qualifier
+        if (!convertedToLong && count == 3) { // qualifier
             qualifier = token;
+        } else if (convertedToLong && l < 0) {
+            //negative version part
+            celix_utils_freeStringIfNotEqual(buffer, versionWrkStr);
+            return CELIX_ILLEGAL_ARGUMENT;
         } else if (convertedToLong && count < 3) {
             versionsParts[count] = (int)l;
         } else if (!convertedToLong) {

Reply via email to