From 08567fedf44048339d5ab1aae951b00a996254d8 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 8 Apr 2020 13:08:27 +1000 Subject: [PATCH] CDROM: Fix crash when loading save state from different system --- src/core/cdrom.cpp | 4 ++-- src/core/cdrom.h | 2 +- src/core/system.cpp | 9 ++++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index 4c5372fe9..81400fc3c 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -195,9 +195,9 @@ void CDROM::InsertMedia(std::unique_ptr media) m_reader.SetMedia(std::move(media)); } -void CDROM::RemoveMedia() +void CDROM::RemoveMedia(bool force /* = false */) { - if (!m_reader.HasMedia()) + if (!m_reader.HasMedia() && !force) return; Log_InfoPrintf("Removing CD..."); diff --git a/src/core/cdrom.h b/src/core/cdrom.h index 7639a56b0..4f7a35324 100644 --- a/src/core/cdrom.h +++ b/src/core/cdrom.h @@ -31,7 +31,7 @@ public: bool HasMedia() const; std::string GetMediaFileName() const; void InsertMedia(std::unique_ptr media); - void RemoveMedia(); + void RemoveMedia(bool force = false); // I/O u8 ReadRegister(u32 offset); diff --git a/src/core/system.cpp b/src/core/system.cpp index a810c6982..5065d7dc7 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -327,6 +327,7 @@ bool System::DoState(StateWrapper& sw) std::string media_filename = m_cdrom->GetMediaFileName(); sw.Do(&media_filename); + bool media_is_bad = false; if (sw.IsReading()) { std::unique_ptr media; @@ -334,7 +335,10 @@ bool System::DoState(StateWrapper& sw) { media = CDImage::Open(media_filename.c_str()); if (!media) - Log_ErrorPrintf("Failed to open CD image from save state: '%s'", media_filename.c_str()); + { + Log_ErrorPrintf("Failed to open CD image from save state: '%s'. Disc will be removed.", media_filename.c_str()); + media_is_bad = true; + } } UpdateRunningGame(media_filename.c_str(), media.get()); @@ -384,6 +388,9 @@ bool System::DoState(StateWrapper& sw) if (!sw.DoMarker("Events") || !DoEventsState(sw)) return false; + if (media_is_bad) + m_cdrom->RemoveMedia(true); + return !sw.HasError(); }