diff --git a/Userland/Utilities/truncate.cpp b/Userland/Utilities/truncate.cpp index d9ad41ba26..6967002bd0 100644 --- a/Userland/Utilities/truncate.cpp +++ b/Userland/Utilities/truncate.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -53,12 +54,34 @@ ErrorOr serenity_main(Main::Arguments arguments) break; } + auto suffix = resize[resize.length() - 1]; + i64 multiplier = 1; + if (!AK::is_ascii_digit(suffix)) { + switch (to_ascii_lowercase(suffix)) { + case 'k': + multiplier = KiB; + resize = resize.substring_view(0, resize.length() - 1); + break; + case 'm': + multiplier = MiB; + resize = resize.substring_view(0, resize.length() - 1); + break; + case 'g': + multiplier = GiB; + resize = resize.substring_view(0, resize.length() - 1); + break; + default: + args_parser.print_usage(stderr, arguments.strings[0]); + return 1; + } + } + auto size_opt = resize.to_int(); - if (!size_opt.has_value()) { + if (!size_opt.has_value() || Checked::multiplication_would_overflow(size_opt.value(), multiplier)) { args_parser.print_usage(stderr, arguments.strings[0]); return 1; } - size = size_opt.value(); + size = size_opt.value() * multiplier; } if (!reference.is_empty()) {