X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fbasic%2Ftime-util.c;h=397637f53b561e757ec3076fde92f6e29b2a549c;hb=9800a6ceb4801bb1f3e851b2244c84a8d8f116b1;hp=7da7ea41c1a632e5896eec40eebbb6dc845e1b8b;hpb=e8e6b286fd0e65709fe372773e58b1b7ebcfffcd;p=elogind.git diff --git a/src/basic/time-util.c b/src/basic/time-util.c index 7da7ea41c..397637f53 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -860,19 +860,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; @@ -1024,6 +1028,16 @@ int parse_sec(const char *t, usec_t *usec) { } #if 0 /// UNNEEDED by elogind +int parse_sec_fix_0(const char *t, usec_t *usec) { + t += strspn(t, WHITESPACE); + if (streq(t, "0")) { + *usec = USEC_INFINITY; + return 0; + } + + return parse_sec(t, usec); +} + int parse_nsec(const char *t, nsec_t *nsec) { static const struct { const char *suffix;