diff options
author | german77 <juangerman-13@hotmail.com> | 2023-10-22 05:03:04 +0200 |
---|---|---|
committer | german77 <juangerman-13@hotmail.com> | 2023-10-22 05:04:03 +0200 |
commit | bbdaa6217528cad18716e368823f66056895dad7 (patch) | |
tree | 0df959ef31770cbdff50e9112c636cb9fbec328d | |
parent | Merge pull request #11748 from liamwhite/kern_1700 (diff) | |
download | yuzu-bbdaa6217528cad18716e368823f66056895dad7.tar yuzu-bbdaa6217528cad18716e368823f66056895dad7.tar.gz yuzu-bbdaa6217528cad18716e368823f66056895dad7.tar.bz2 yuzu-bbdaa6217528cad18716e368823f66056895dad7.tar.lz yuzu-bbdaa6217528cad18716e368823f66056895dad7.tar.xz yuzu-bbdaa6217528cad18716e368823f66056895dad7.tar.zst yuzu-bbdaa6217528cad18716e368823f66056895dad7.zip |
-rw-r--r-- | src/core/memory/cheat_engine.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp index a06e99166..53a89cc8f 100644 --- a/src/core/memory/cheat_engine.cpp +++ b/src/core/memory/cheat_engine.cpp @@ -19,16 +19,23 @@ namespace Core::Memory { namespace { constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12}; -std::string_view ExtractName(std::string_view data, std::size_t start_index, char match) { +std::string_view ExtractName(std::size_t& out_name_size, std::string_view data, + std::size_t start_index, char match) { auto end_index = start_index; while (data[end_index] != match) { ++end_index; - if (end_index > data.size() || - (end_index - start_index - 1) > sizeof(CheatDefinition::readable_name)) { + if (end_index > data.size()) { return {}; } } + out_name_size = end_index - start_index; + + // Clamp name if it's too big + if (out_name_size > sizeof(CheatDefinition::readable_name)) { + end_index = start_index + sizeof(CheatDefinition::readable_name); + } + return data.substr(start_index, end_index - start_index); } } // Anonymous namespace @@ -113,7 +120,8 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const { return {}; } - const auto name = ExtractName(data, i + 1, '}'); + std::size_t name_size{}; + const auto name = ExtractName(name_size, data, i + 1, '}'); if (name.empty()) { return {}; } @@ -125,12 +133,13 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const { .definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] = '\0'; - i += name.length() + 1; + i += name_size + 1; } else if (data[i] == '[') { current_entry = out.size(); out.emplace_back(); - const auto name = ExtractName(data, i + 1, ']'); + std::size_t name_size{}; + const auto name = ExtractName(name_size, data, i + 1, ']'); if (name.empty()) { return {}; } @@ -142,7 +151,7 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const { .definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] = '\0'; - i += name.length() + 1; + i += name_size + 1; } else if (::isxdigit(data[i])) { if (!current_entry || out[*current_entry].definition.num_opcodes >= out[*current_entry].definition.opcodes.size()) { |