diff --git a/src/core/core-util.c b/src/core/core-util.c index cdf041742..9332d33da 100644 --- a/src/core/core-util.c +++ b/src/core/core-util.c @@ -843,9 +843,10 @@ util_version_number (const char *version) buf[index_buf] = '\0'; if (buf[0]) { + errno = 0; error = NULL; number = strtoul (buf, &error, 10); - if (error && !error[0]) + if ((errno != ERANGE) && error && !error[0]) { if (number > 0xFF) number = 0xFF; diff --git a/tests/unit/core/test-core-util.cpp b/tests/unit/core/test-core-util.cpp index 7e0c40dda..35c941a33 100644 --- a/tests/unit/core/test-core-util.cpp +++ b/tests/unit/core/test-core-util.cpp @@ -767,10 +767,16 @@ TEST(CoreUtil, ParseDelay) TEST(CoreUtil, VersionNumber) { + char str_version[256]; + CHECK(util_version_number (NULL) == 0); CHECK(util_version_number ("") == 0); CHECK(util_version_number ("abc") == 0); + /* invalid unsigned long: outside range (0, ULONG_MAX) */ + snprintf (str_version, sizeof (str_version), "0.0.%lu1", ULONG_MAX); + CHECK(util_version_number (str_version) == 0); + CHECK(util_version_number ("0.3.2-dev") == 0x00030200); CHECK(util_version_number ("0.3.2-rc1") == 0x00030200); CHECK(util_version_number ("0.3.2") == 0x00030200);