diff options
| author | Shawn Hoffman <godisgovernment@gmail.com> | 2009-10-25 02:03:45 +0000 |
|---|---|---|
| committer | Shawn Hoffman <godisgovernment@gmail.com> | 2009-10-25 02:03:45 +0000 |
| commit | 73fda8cfbf6b4e60162b2262aa932da60563dc07 (patch) | |
| tree | 7cbbbe1146411446e0188687fbc8fbdc9e4456eb /Source/Core | |
| parent | 1ce145e86ed33df64b6e08e5977366cecc2f69bf (diff) | |
Fix a possible crash on close due to INANDContentLoader objects getting deleted twice
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4463 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp | 18 | ||||
| -rw-r--r-- | Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp | 6 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Src/NANDContentLoader.cpp | 12 |
3 files changed, 14 insertions, 22 deletions
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp index 262b1b4ec5..4e008fadff 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp @@ -83,11 +83,11 @@ CWII_IPC_HLE_Device_es::CWII_IPC_HLE_Device_es(u32 _DeviceID, const std::string& // scan for the title ids listed in TMDs within /title/ m_TitleIDs.clear(); - m_TitleIDs.push_back(0x0000000100000002ULL); - // m_TitleIDs.push_back(0x0001000248414741ULL); - // m_TitleIDs.push_back(0x0001000248414341ULL); - // m_TitleIDs.push_back(0x0001000248414241ULL); - // m_TitleIDs.push_back(0x0001000248414141ULL); + m_TitleIDs.push_back(0x0000000100000002ULL); + //m_TitleIDs.push_back(0x0001000248414741ULL); + //m_TitleIDs.push_back(0x0001000248414341ULL); + //m_TitleIDs.push_back(0x0001000248414241ULL); + //m_TitleIDs.push_back(0x0001000248414141ULL); //FindValidTitleIDs(); @@ -97,13 +97,7 @@ CWII_IPC_HLE_Device_es::CWII_IPC_HLE_Device_es(u32 _DeviceID, const std::string& CWII_IPC_HLE_Device_es::~CWII_IPC_HLE_Device_es() { - CTitleToContentMap::const_iterator itr = m_NANDContent.begin(); - while(itr != m_NANDContent.end()) - { - if (itr->second) - delete itr->second; - itr++; - } + // Leave deletion of the INANDContentLoader objects to CNANDContentManager, don't do it here! m_NANDContent.clear(); } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp index dd5a25c3ab..d3ac0ddd54 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp @@ -197,7 +197,7 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) Extensions.push_back("*.*"); CFileSearch FileSearch(Extensions, Directories); - + u64 overAllSize = 0; for (size_t i=0; i<FileSearch.GetFileNames().size(); i++) { @@ -220,7 +220,7 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) // PanicAlert("IOCTL_GETUSAGE - unk dir %s", Filename.c_str()); WARN_LOG(WII_IPC_FILEIO, " error: not executed on a valid directoy: %s", Filename.c_str()); } - + Memory::Write_U32(fsBlock, CommandBuffer.PayloadBuffer[0].m_Address); Memory::Write_U32(iNodes, CommandBuffer.PayloadBuffer[1].m_Address); } @@ -233,7 +233,7 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) } Memory::Write_U32(ReturnValue, _CommandAddress+4); - + return true; } diff --git a/Source/Core/DiscIO/Src/NANDContentLoader.cpp b/Source/Core/DiscIO/Src/NANDContentLoader.cpp index 93fd9458f3..1d6c9e7746 100644 --- a/Source/Core/DiscIO/Src/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/Src/NANDContentLoader.cpp @@ -164,7 +164,7 @@ CNANDContentLoader::CNANDContentLoader(const std::string& _rName) } else { -// _dbg_assert_msg_(BOOT, 0, "CNANDContentLoader loads neither folder nor file"); + _dbg_assert_msg_(BOOT, 0, "CNANDContentLoader loads neither folder nor file"); } } @@ -362,14 +362,12 @@ CNANDContentManager::~CNANDContentManager() const INANDContentLoader& CNANDContentManager::GetNANDLoader(const std::string& _rName) { - std::string KeyString(_rName); + CNANDContentMap::iterator lb = m_Map.lower_bound(_rName); - CNANDContentMap::iterator itr = m_Map.find(KeyString); - if (itr != m_Map.end()) - return *itr->second; + if(lb == m_Map.end() || (m_Map.key_comp()(_rName, lb->first))) + m_Map.insert(lb, CNANDContentMap::value_type(_rName, new CNANDContentLoader(_rName))); - m_Map[KeyString] = new CNANDContentLoader(KeyString); - return *m_Map[KeyString]; + return *m_Map[_rName]; } } // namespace end |
