From 9fccccedee481953451054138fe4a2c6b133677c Mon Sep 17 00:00:00 2001 From: german77 Date: Sat, 24 Feb 2024 13:27:57 -0600 Subject: [PATCH] service: set: Fix GetSettingsItemValue --- src/core/hle/service/glue/time/worker.cpp | 7 ++----- .../service/set/system_settings_server.cpp | 13 +++++++----- .../hle/service/set/system_settings_server.h | 21 ++++++++----------- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/core/hle/service/glue/time/worker.cpp b/src/core/hle/service/glue/time/worker.cpp index b28569b688..b6bbd7965a 100644 --- a/src/core/hle/service/glue/time/worker.cpp +++ b/src/core/hle/service/glue/time/worker.cpp @@ -26,12 +26,9 @@ Service::PSC::Time::SystemClockContext g_report_ephemeral_clock_context{}; template T GetSettingsItemValue(std::shared_ptr& set_sys, const char* category, const char* name) { - std::vector interval_buf; - auto res = set_sys->GetSettingsItemValueImpl(interval_buf, category, name); - ASSERT(res == ResultSuccess); - T v{}; - std::memcpy(&v, interval_buf.data(), sizeof(T)); + auto res = set_sys->GetSettingsItemValueImpl(v, category, name); + ASSERT(res == ResultSuccess); return v; } diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index 6a7ea83fda..900d5408f4 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -308,7 +308,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) SetupSettings(); m_system_settings.region_code = - static_cast(Settings::values.region_index.GetValue()); + static_cast(::Settings::values.region_index.GetValue()); // TODO: Remove this when starter applet is fully functional EulaVersion eula_version{ @@ -715,7 +715,7 @@ Result ISystemSettingsServer::GetSettingsItemValueSize( } Result ISystemSettingsServer::GetSettingsItemValue( - OutBuffer out_data, + Out out_size, OutBuffer out_data, InLargeData setting_category_buffer, InLargeData setting_name_buffer) { const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)}; @@ -723,7 +723,7 @@ Result ISystemSettingsServer::GetSettingsItemValue( LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name); - R_RETURN(GetSettingsItemValueImpl(out_data, setting_category, setting_name)); + R_RETURN(GetSettingsItemValueImpl(out_data, *out_size, setting_category, setting_name)); } Result ISystemSettingsServer::GetTvSettings(Out out_tv_settings) { @@ -1363,13 +1363,16 @@ void ISystemSettingsServer::SetSaveNeeded() { m_save_needed = true; } -Result ISystemSettingsServer::GetSettingsItemValueImpl(std::vector& out_value, +Result ISystemSettingsServer::GetSettingsItemValueImpl(std::span out_value, u64& out_size, const std::string& category, const std::string& name) { auto settings{GetSettings()}; R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown); - out_value = settings[category][name]; + ASSERT_MSG(out_value.size() >= settings[category][name].size(), + "Stored type is bigger than requested type"); + out_size = std::min(settings[category][name].size(), out_value.size()); + std::memcpy(out_value.data(), settings[category][name].data(), out_size); R_SUCCEED(); } diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h index 46e06c8ea4..9a1154ad65 100644 --- a/src/core/hle/service/set/system_settings_server.h +++ b/src/core/hle/service/set/system_settings_server.h @@ -34,20 +34,17 @@ public: explicit ISystemSettingsServer(Core::System& system_); ~ISystemSettingsServer() override; - Result GetSettingsItemValueImpl(std::vector& out_value, const std::string& category, - const std::string& name); + Result GetSettingsItemValueImpl(std::span out_value, u64& out_size, + const std::string& category, const std::string& name); template - Result GetSettingsItemValueImpl(T& value, const std::string& category, + Result GetSettingsItemValueImpl(T& out_value, const std::string& category, const std::string& name) { - std::vector data; - const auto result = GetSettingsItemValueImpl(data, category, name); - if (result.IsError()) { - return result; - } - ASSERT(data.size() >= sizeof(T)); - std::memcpy(&value, data.data(), sizeof(T)); - return result; + u64 data_size{}; + std::vector data(sizeof(T)); + R_TRY(GetSettingsItemValueImpl(data, data_size, category, name)); + std::memcpy(&out_value, data.data(), data_size); + R_SUCCEED(); } public: @@ -84,7 +81,7 @@ public: InLargeData setting_category_buffer, InLargeData setting_name_buf); Result GetSettingsItemValue( - OutBuffer out_data, + Out out_size, OutBuffer out_data, InLargeData setting_category_buffer, InLargeData setting_name_buffer); Result GetTvSettings(Out out_tv_settings);