From abbbadd30b8d9a4fe825fbf966fae118f672cd69 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Fri, 29 Dec 2023 22:04:33 +0100 Subject: [PATCH] fix(util): improve error handling in parse_(size|time)_with_unit --- src/dwarfs/util.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/dwarfs/util.cpp b/src/dwarfs/util.cpp index 64946064..d7c81674 100644 --- a/src/dwarfs/util.cpp +++ b/src/dwarfs/util.cpp @@ -73,37 +73,41 @@ std::string time_with_unit(double sec) { } size_t parse_size_with_unit(std::string const& str) { - size_t end = 0; - size_t size = std::stoul(str, &end); + size_t value; + auto [ptr, ec]{std::from_chars(str.data(), str.data() + str.size(), value)}; - if (str[end] == '\0') { - return size; + if (ec != std::errc()) { + DWARFS_THROW(runtime_error, "cannot parse size value"); } - if (str[end + 1] == '\0') { - switch (str[end]) { + if (ptr[0] == '\0') { + return value; + } + + if (ptr[1] == '\0') { + switch (ptr[0]) { case 't': case 'T': - size <<= 10; + value <<= 10; [[fallthrough]]; case 'g': case 'G': - size <<= 10; + value <<= 10; [[fallthrough]]; case 'm': case 'M': - size <<= 10; + value <<= 10; [[fallthrough]]; case 'k': case 'K': - size <<= 10; - return size; + value <<= 10; + return value; default: break; } } - DWARFS_THROW(runtime_error, "invalid size suffix"); + DWARFS_THROW(runtime_error, "unsupported size suffix"); } std::chrono::milliseconds parse_time_with_unit(std::string const& str) { @@ -129,8 +133,12 @@ std::chrono::milliseconds parse_time_with_unit(std::string const& str) { } break; - case '\0': case 's': + if (ptr[1] != '\0') { + break; + } + [[fallthrough]]; + case '\0': return std::chrono::seconds(value); default: