]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
parse-util: make sure "-0.-0s" is not considered a valid time specification
authorLennart Poettering <lennart@poettering.net>
Tue, 17 Jul 2018 11:01:46 +0000 (13:01 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 17 Jul 2018 11:01:46 +0000 (13:01 +0200)
Did I mention that strtoll() is super-hard to use properly?

src/basic/time-util.c
src/test/test-time-util.c

index fe201c398d4742a6bea3218df1f367fef3d3a618..2eff230c6898afaa37a66d995e3171a91370f559 100644 (file)
@@ -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;
 
index 87de8d172c2385b460030f73c4cb014562e78428..d7cb459e660f61d007826a643ed169fc2c1eaefd 100644 (file)
@@ -42,6 +42,12 @@ static void test_parse_sec(void) {
         assert_se(parse_sec(" . ", &u) < 0);
         assert_se(parse_sec(" 5. ", &u) < 0);
         assert_se(parse_sec(".s ", &u) < 0);
+        assert_se(parse_sec("-5s ", &u) < 0);
+        assert_se(parse_sec("-0.3s ", &u) < 0);
+        assert_se(parse_sec("-0.0s ", &u) < 0);
+        assert_se(parse_sec("-0.-0s ", &u) < 0);
+        assert_se(parse_sec("0.-0s ", &u) < 0);
+        assert_se(parse_sec("3.-0s ", &u) < 0);
         assert_se(parse_sec(" infinity .7", &u) < 0);
         assert_se(parse_sec(".3 infinity", &u) < 0);
 }