summaryrefslogtreecommitdiff
path: root/src/basic
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-07-17 13:01:46 +0200
committerLennart Poettering <lennart@poettering.net>2018-07-17 13:01:46 +0200
commit5a9fb35843d2384a5539a079c4d13c095705fa94 (patch)
treed16035e0cd59aa7a0ded90a8b3e535d0e729cc07 /src/basic
parenta7edb403e573751ee701e5c32a76171ab34f504e (diff)
downloadsystemd-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.c22
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;