From 7a1f676ef475c5d3843be3e0f625c97f259d55cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Wed, 8 Feb 2017 21:37:12 +0100 Subject: [PATCH] Always use configured root when installing WAD This prevents Dolphin from writing to /sys/uid.sys (on the host; root partition) when installing a WAD before starting emulation, because the session root is not initialized at that moment. Incidentally, this also gets rid of a singleton. --- Source/Core/Core/HW/HW.cpp | 1 - Source/Core/Core/IOS/ES/ES.cpp | 6 ++++-- Source/Core/DiscIO/NANDContentLoader.cpp | 16 ++++------------ Source/Core/DiscIO/NANDContentLoader.h | 15 ++------------- 4 files changed, 10 insertions(+), 28 deletions(-) diff --git a/Source/Core/Core/HW/HW.cpp b/Source/Core/Core/HW/HW.cpp index 3137a8ed85..4480d58002 100644 --- a/Source/Core/Core/HW/HW.cpp +++ b/Source/Core/Core/HW/HW.cpp @@ -52,7 +52,6 @@ void Init() if (SConfig::GetInstance().bWii) { Core::InitializeWiiRoot(Core::g_want_determinism); - DiscIO::cUIDsys::AccessInstance().UpdateLocation(); DiscIO::CSharedContent::AccessInstance().UpdateLocation(); IOS::Init(); IOS::HLE::Init(); // Depends on Memory diff --git a/Source/Core/Core/IOS/ES/ES.cpp b/Source/Core/Core/IOS/ES/ES.cpp index 9274866b08..ba85691e08 100644 --- a/Source/Core/Core/IOS/ES/ES.cpp +++ b/Source/Core/Core/IOS/ES/ES.cpp @@ -121,7 +121,8 @@ void ES::OpenInternal() m_TitleID = contentLoader.GetTitleID(); m_TitleIDs.clear(); - DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDs); + DiscIO::cUIDsys uid_sys{Common::FromWhichRoot::FROM_SESSION_ROOT}; + uid_sys.GetTitleIDs(m_TitleIDs); // uncomment if ES_GetOwnedTitlesCount / ES_GetOwnedTitles is implemented // m_TitleIDsOwned.clear(); // DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDsOwned, true); @@ -1324,7 +1325,8 @@ u32 ES::ES_DIVerify(const std::vector& tmd) if (!tmd_file.WriteBytes(tmd.data(), tmd.size())) ERROR_LOG(IOS_ES, "DIVerify failed to write disc TMD to NAND."); } - DiscIO::cUIDsys::AccessInstance().AddTitle(tmd_title_id); + DiscIO::cUIDsys uid_sys{Common::FromWhichRoot::FROM_SESSION_ROOT}; + uid_sys.AddTitle(tmd_title_id); // DI_VERIFY writes to title.tmd, which is read and cached inside the NAND Content Manager. // clear the cache to avoid content access mismatches. DiscIO::CNANDContentManager::Access().ClearCache(); diff --git a/Source/Core/DiscIO/NANDContentLoader.cpp b/Source/Core/DiscIO/NANDContentLoader.cpp index b57f6eb0ea..639891d899 100644 --- a/Source/Core/DiscIO/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/NANDContentLoader.cpp @@ -398,16 +398,11 @@ void CNANDContentLoader::RemoveTitle() const } } -cUIDsys::cUIDsys() -{ - UpdateLocation(); -} - -void cUIDsys::UpdateLocation() +cUIDsys::cUIDsys(Common::FromWhichRoot root) { m_Elements.clear(); m_LastUID = 0x00001000; - m_UidSys = File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/sys/uid.sys"; + m_UidSys = Common::RootUserPath(root) + "/sys/uid.sys"; File::IOFile pFile(m_UidSys, "rb"); SElement Element; @@ -430,10 +425,6 @@ void cUIDsys::UpdateLocation() } } -cUIDsys::~cUIDsys() -{ -} - u32 cUIDsys::GetUIDFromTitle(u64 title_id) { for (auto& Element : m_Elements) @@ -541,7 +532,8 @@ u64 CNANDContentManager::Install_WiiWAD(const std::string& filename) return 0; } - cUIDsys::AccessInstance().AddTitle(title_id); + cUIDsys uid_sys{Common::FromWhichRoot::FROM_CONFIGURED_ROOT}; + uid_sys.AddTitle(title_id); ClearCache(); diff --git a/Source/Core/DiscIO/NANDContentLoader.h b/Source/Core/DiscIO/NANDContentLoader.h index 193bee596f..a5c93d7539 100644 --- a/Source/Core/DiscIO/NANDContentLoader.h +++ b/Source/Core/DiscIO/NANDContentLoader.h @@ -188,27 +188,16 @@ private: std::vector m_Elements; }; -class cUIDsys +class cUIDsys final { public: - static cUIDsys& AccessInstance() - { - static cUIDsys instance; - return instance; - } + explicit cUIDsys(Common::FromWhichRoot root); u32 GetUIDFromTitle(u64 title_id); void AddTitle(u64 title_id); void GetTitleIDs(std::vector& title_ids, bool owned = false); - void UpdateLocation(); private: - cUIDsys(); - virtual ~cUIDsys(); - - cUIDsys(cUIDsys const&) = delete; - void operator=(cUIDsys const&) = delete; - #pragma pack(push, 1) struct SElement {