diff --git a/src/core/core-util.c b/src/core/core-util.c index dd09ef777..cdf041742 100644 --- a/src/core/core-util.c +++ b/src/core/core-util.c @@ -773,9 +773,10 @@ util_parse_delay (const char *string_delay, unsigned long long default_factor, if (!str_number) return 0; + errno = 0; error = NULL; *delay = strtoull (str_number, &error, 10); - if (!error || error[0]) + if ((errno == ERANGE) || !error || error[0]) { free (str_number); *delay = 0; diff --git a/tests/unit/core/test-core-util.cpp b/tests/unit/core/test-core-util.cpp index 05ad9143d..7e0c40dda 100644 --- a/tests/unit/core/test-core-util.cpp +++ b/tests/unit/core/test-core-util.cpp @@ -698,6 +698,7 @@ TEST(CoreUtil, GetTimeDiff) TEST(CoreUtil, ParseDelay) { unsigned long long delay; + char str_delay[128]; /* error: no delay */ LONGS_EQUAL(0, util_parse_delay ("123", 1ULL, NULL)); @@ -721,8 +722,10 @@ TEST(CoreUtil, ParseDelay) /* error: bad number */ WEE_PARSE_DELAY(0, 0ULL, "abcd", 1LL); - /* error: bad delay */ + /* invalid unsigned long long: outside range (0, ULLONG_MAX) */ WEE_PARSE_DELAY(0, 0ULL, "-123", 1LL); + snprintf (str_delay, sizeof (str_delay), "%llu1", ULLONG_MAX); + LONGS_EQUAL(0, util_parse_delay (str_delay, 10, &delay)); /* tests with delay == 0 */ WEE_PARSE_DELAY(1, 0ULL, "0", 1ULL);