time-util: make parse_timestamp() set 0 if the input is very old date (#6297)

If the input is older than "1970-01-01 UTC", then `parse_timestamp()`
fails and returns -EINVAL. However, if the input is e.g. `-100years`,
then the function succeeds and sets `usec = 0`.
This commit makes the function also succeed for old dates and set
`usec = 0`.

Fixes #6290.
This commit is contained in:
Yu Watanabe
2017-07-08 15:59:07 -04:00
committed by Zbigniew Jędrzejewski-Szmek
parent b1aa5ced45
commit 7635ab8e74
2 changed files with 24 additions and 13 deletions
+8 -4
View File
@@ -847,19 +847,23 @@ parse_usec:
from_tm:
x = mktime_or_timegm(&tm, utc);
if (x < 0)
return -EINVAL;
if (x == (time_t) -1)
return -EOVERFLOW;
if (weekday >= 0 && tm.tm_wday != weekday)
return -EINVAL;
ret = (usec_t) x * USEC_PER_SEC + x_usec;
if (x < 0)
ret = 0;
else
ret = (usec_t) x * USEC_PER_SEC + x_usec;
if (ret > USEC_TIMESTAMP_FORMATTABLE_MAX)
return -EINVAL;
finish:
if (ret + plus < ret) /* overflow? */
return -EINVAL;
return -EOVERFLOW;
ret += plus;
if (ret > USEC_TIMESTAMP_FORMATTABLE_MAX)
return -EINVAL;