From 8079c90333422bbc008b68a9b7cefbdb8a15a4e9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 23 Oct 2018 22:23:34 +0900 Subject: [PATCH 1/4] util: check overflow in parse_time() --- src/basic/time-util.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/basic/time-util.c b/src/basic/time-util.c index 9115c3bf27..e24eef4082 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -1048,12 +1048,21 @@ int parse_time(const char *t, usec_t *usec, usec_t default_unit) { something = true; + + k = ((usec_t) -1) / multiplier; + if ((usec_t) l + 1 >= k || (usec_t) z >= k) + return -ERANGE; + k = (usec_t) z * multiplier; for (; n > 0; n--) k /= 10; - r += (usec_t) l * multiplier + k; + k += (usec_t) l * multiplier; + if (k >= ((usec_t) -1) - r) + return -ERANGE; + + r += k; } *usec = r; From f6a178e91dd5fccf43f659eca887788fd5dcdccf Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 23 Oct 2018 22:24:16 +0900 Subject: [PATCH 2/4] util: check overflow in parse_nsec() --- src/basic/time-util.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/basic/time-util.c b/src/basic/time-util.c index e24eef4082..4d297394e2 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -1194,12 +1194,22 @@ int parse_nsec(const char *t, nsec_t *nsec) { for (i = 0; i < ELEMENTSOF(table); i++) if (startswith(e, table[i].suffix)) { - nsec_t k = (nsec_t) z * table[i].nsec; + nsec_t k; + + k = ((nsec_t) -1) / table[i].nsec; + if ((nsec_t) l + 1 >= k || (nsec_t) z >= k) + return -ERANGE; + + k = (nsec_t) z * table[i].nsec; for (; n > 0; n--) k /= 10; - r += (nsec_t) l * table[i].nsec + k; + k += (nsec_t) l * table[i].nsec; + if (k >= ((nsec_t) -1) - r) + return -ERANGE; + + r += k; p = e + strlen(table[i].suffix); something = true; From db4e61071d8f1cdf5f2f0c75985a65036cac2373 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 23 Oct 2018 22:25:01 +0900 Subject: [PATCH 3/4] test: add tests for detecting overflow in parse_time() and parse_nsec() --- src/test/test-time-util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/test-time-util.c b/src/test/test-time-util.c index 58c365df57..82a71d0478 100644 --- a/src/test/test-time-util.c +++ b/src/test/test-time-util.c @@ -94,6 +94,9 @@ static void test_parse_time(void) { assert_se(parse_time("5s", &u, USEC_PER_MSEC) >= 0); assert_se(u == 5 * USEC_PER_SEC); + + assert_se(parse_time("11111111111111y", &u, 1) == -ERANGE); + assert_se(parse_time("1.1111111111111y", &u, 1) == -ERANGE); } static void test_parse_nsec(void) { @@ -144,6 +147,8 @@ static void test_parse_nsec(void) { assert_se(parse_nsec("3.+1s", &u) < 0); assert_se(parse_nsec("3. 1s", &u) < 0); assert_se(parse_nsec("3.s", &u) < 0); + assert_se(parse_nsec("1111111111111y", &u) == -ERANGE); + assert_se(parse_nsec("1.111111111111y", &u) == -ERANGE); } static void test_format_timespan_one(usec_t x, usec_t accuracy) { From cb39201e72148b2ade51dc1dfba8a602be643722 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 23 Oct 2018 22:28:21 +0900 Subject: [PATCH 4/4] bash-completion: analyze: add timespan Follow-up for 3f1c1287a96dfc146ce894bd6bfff388cba0ab55. --- shell-completion/bash/systemd-analyze | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell-completion/bash/systemd-analyze b/shell-completion/bash/systemd-analyze index 4bc146aa06..a8bc752f1e 100644 --- a/shell-completion/bash/systemd-analyze +++ b/shell-completion/bash/systemd-analyze @@ -41,7 +41,7 @@ _systemd_analyze() { ) local -A VERBS=( - [STANDALONE]='time blame plot dump unit-paths calendar' + [STANDALONE]='time blame plot dump unit-paths calendar timespan' [CRITICAL_CHAIN]='critical-chain' [DOT]='dot' [LOG_LEVEL]='log-level'