summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2024-05-03 17:10:04 +0200
committerGitHub <noreply@github.com>2024-05-03 17:10:04 +0200
commit42583deea7f2e8a5d9be3bd6285c0893e89ae895 (patch)
tree1da63fb2e4fe282322fb785330ae28f231618375 /Source
parent5817be7bd3ac1b3f68a24410dc416d69ae2ff20f (diff)
parentfc64b43fae582ddb66c79f009bed4d51462bd22b (diff)
Merge pull request #12754 from LillyJadeKatrin/retroachievements-possiblememoryleakfix
Fix possible memory leak in an Achievement Manager callback
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/AchievementManager.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp
index bf714f0e65..2c4241498d 100644
--- a/Source/Core/Core/AchievementManager.cpp
+++ b/Source/Core/Core/AchievementManager.cpp
@@ -15,6 +15,7 @@
#include "Common/Image.h"
#include "Common/Logging/Log.h"
+#include "Common/ScopeGuard.h"
#include "Common/WorkQueueThread.h"
#include "Core/Config/AchievementSettings.h"
#include "Core/Core.h"
@@ -564,15 +565,16 @@ void AchievementManager::LeaderboardEntriesCallback(int result, const char* erro
rc_client_leaderboard_entry_list_t* list,
rc_client_t* client, void* userdata)
{
+ u32* leaderboard_id = reinterpret_cast<u32*>(userdata);
+ Common::ScopeGuard on_end_scope([&]() { delete leaderboard_id; });
+
if (result != RC_OK)
{
WARN_LOG_FMT(ACHIEVEMENTS, "Failed to fetch leaderboard entries.");
return;
}
- u32 leaderboard_id = *reinterpret_cast<u32*>(userdata);
- delete userdata;
- auto& leaderboard = AchievementManager::GetInstance().m_leaderboard_map[leaderboard_id];
+ auto& leaderboard = AchievementManager::GetInstance().m_leaderboard_map[*leaderboard_id];
for (size_t ix = 0; ix < list->num_entries; ix++)
{
std::lock_guard lg{AchievementManager::GetInstance().GetLock()};
@@ -582,7 +584,7 @@ void AchievementManager::LeaderboardEntriesCallback(int result, const char* erro
memcpy(map_entry.score.data(), response_entry.display, FORMAT_SIZE);
map_entry.rank = response_entry.rank;
}
- AchievementManager::GetInstance().m_update_callback({.leaderboards = {leaderboard_id}});
+ AchievementManager::GetInstance().m_update_callback({.leaderboards = {*leaderboard_id}});
}
void AchievementManager::LoadGameCallback(int result, const char* error_message,