diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-07-17 13:01:46 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-07-17 13:01:46 +0200 |
commit | 5a9fb35843d2384a5539a079c4d13c095705fa94 (patch) | |
tree | d16035e0cd59aa7a0ded90a8b3e535d0e729cc07 /src/basic | |
parent | a7edb403e573751ee701e5c32a76171ab34f504e (diff) | |
download | systemd-5a9fb35843d2384a5539a079c4d13c095705fa94.tar.gz |
parse-util: make sure "-0.-0s" is not considered a valid time specification
Did I mention that strtoll() is super-hard to use properly?
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/time-util.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/basic/time-util.c b/src/basic/time-util.c index fe201c398d..2eff230c68 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -996,10 +996,10 @@ int parse_time(const char *t, usec_t *usec, usec_t default_unit) { } for (;;) { + usec_t multiplier = default_unit, k; long long l, z = 0; - char *e; unsigned n = 0; - usec_t multiplier = default_unit, k; + char *e; p += strspn(p, WHITESPACE); @@ -1010,6 +1010,9 @@ int parse_time(const char *t, usec_t *usec, usec_t default_unit) { break; } + if (*p == '-') /* Don't allow "-0" */ + return -ERANGE; + errno = 0; l = strtoll(p, &e, 10); if (errno > 0) @@ -1020,14 +1023,15 @@ int parse_time(const char *t, usec_t *usec, usec_t default_unit) { if (*e == '.') { char *b = e + 1; + if (*b == '-') /* Don't allow 0.-0 */ + return -EINVAL; + errno = 0; z = strtoll(b, &e, 10); if (errno > 0) return -errno; - if (z < 0) return -ERANGE; - if (e == b) return -EINVAL; @@ -1144,26 +1148,28 @@ int parse_nsec(const char *t, nsec_t *nsec) { break; } + if (*p == '-') + return -ERANGE; + errno = 0; l = strtoll(p, &e, 10); - if (errno > 0) return -errno; - if (l < 0) return -ERANGE; if (*e == '.') { char *b = e + 1; + if (*b == '-') + return -EINVAL; + errno = 0; z = strtoll(b, &e, 10); if (errno > 0) return -errno; - if (z < 0) return -ERANGE; - if (e == b) return -EINVAL; |