From 26bb3e1acf4aa1814573d628af356f9fbb628786 Mon Sep 17 00:00:00 2001 From: Xavier Defrang Date: Mon, 20 Dec 2021 21:19:18 +0100 Subject: [PATCH] chmod+mkdir: Use convert_to_uint_from_octal --- Userland/Utilities/chmod.cpp | 17 +++++++++++++---- Userland/Utilities/mkdir.cpp | 4 +++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Userland/Utilities/chmod.cpp b/Userland/Utilities/chmod.cpp index 322654b13f..bed9f0d16d 100644 --- a/Userland/Utilities/chmod.cpp +++ b/Userland/Utilities/chmod.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,12 @@ public: mode_t& get_removal_mask() { return removal_mask; } mode_t& get_applying_mask() { return applying_mask; } + + void set_mode(mode_t mode) + { + this->applying_mask = mode; + this->removal_mask = ~mode; + } }; Optional string_to_mode(char access_scope, StringView access_string); @@ -69,12 +76,14 @@ ErrorOr serenity_main(Main::Arguments arguments) /* compute a mask */ - if (arguments.strings[1][0] >= '0' && arguments.strings[1][0] <= '7') { - if (sscanf(arguments.strings[1].to_string().characters(), "%ho", &mask.get_applying_mask()) != 1) { - perror("sscanf"); + auto mode_string = arguments.strings[1]; + if (mode_string[0] >= '0' && mode_string[0] <= '7') { + mode_t mode = AK::StringUtils::convert_to_uint_from_octal(mode_string).value_or(01000); + if (mode > 0777) { + warnln("chmod: invalid mode: {}", mode_string); return 1; } - mask.get_removal_mask() = ~mask.get_applying_mask(); + mask.set_mode(mode); } else { auto access_strings = arguments.strings[1].split_view(','); for (auto access_string : access_strings) { diff --git a/Userland/Utilities/mkdir.cpp b/Userland/Utilities/mkdir.cpp index 5c34989978..72d24b499a 100644 --- a/Userland/Utilities/mkdir.cpp +++ b/Userland/Utilities/mkdir.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -32,7 +33,8 @@ ErrorOr serenity_main(Main::Arguments arguments) mode_t mode = default_mode; if (!mode_string.is_empty()) { - if (sscanf(mode_string.characters(), "%ho", &mode) != 1) { + mode = AK::StringUtils::convert_to_uint_from_octal(mode_string).value_or(01000); + if (mode > 0777) { warnln("mkdir: invalid mode: {}", mode_string); return 1; }