From cf4412ecbe92828e743727816ae2504dfd5720e7 Mon Sep 17 00:00:00 2001 From: chaoticgd <43898262+chaoticgd@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:32:55 +0000 Subject: [PATCH] SaveState: Fix error handling in SaveState_ZipToDisk --- pcsx2/SaveState.cpp | 20 ++++++++++++++++---- pcsx2/SaveState.h | 4 +++- pcsx2/VMManager.cpp | 19 +++++++++---------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/pcsx2/SaveState.cpp b/pcsx2/SaveState.cpp index 2c37e2605c..208da9292d 100644 --- a/pcsx2/SaveState.cpp +++ b/pcsx2/SaveState.cpp @@ -1039,14 +1039,18 @@ static bool SaveState_AddToZip(zip_t* zf, ArchiveEntryList* srclist, SaveStateSc return true; } -bool SaveState_ZipToDisk(std::unique_ptr srclist, std::unique_ptr screenshot, const char* filename) +bool SaveState_ZipToDisk( + std::unique_ptr srclist, std::unique_ptr screenshot, + const char* filename, Error* error) { zip_error_t ze = {}; zip_source_t* zs = zip_source_file_create(filename, 0, 0, &ze); zip_t* zf = nullptr; if (zs && !(zf = zip_open_from_source(zs, ZIP_CREATE | ZIP_TRUNCATE, &ze))) { - Console.Error("Failed to open zip file '%s' for save state: %s", filename, zip_error_strerror(&ze)); + Error::SetStringFmt(error, + TRANSLATE_FS("SaveState", "Failed to open zip file '{}' for save state: {}."), + filename, zip_error_strerror(&ze)); // have to clean up source zip_source_free(zs); @@ -1056,13 +1060,21 @@ bool SaveState_ZipToDisk(std::unique_ptr srclist, std::unique_ // discard zip file if we fail saving something if (!SaveState_AddToZip(zf, srclist.get(), screenshot.get())) { - Console.Error("Failed to save state to zip file '%s'", filename); + Error::SetStringFmt(error, + TRANSLATE_FS("SaveState", "Failed to save state to zip file '{}'."), filename); zip_discard(zf); return false; } // force the zip to close, this is the expensive part with libzip. - zip_close(zf); + if (zip_close(zf) != 0) + { + Error::SetStringFmt(error, + TRANSLATE_FS("SaveState", "Failed to save state to zip file '{}': {}."), filename, zip_strerror(zf)); + zip_discard(zf); + return false; + } + return true; } diff --git a/pcsx2/SaveState.h b/pcsx2/SaveState.h index 43d1e6e5ef..afd0f84624 100644 --- a/pcsx2/SaveState.h +++ b/pcsx2/SaveState.h @@ -54,7 +54,9 @@ class ArchiveEntryList; // These functions assume that the caller has paused the core thread. extern std::unique_ptr SaveState_DownloadState(Error* error); extern std::unique_ptr SaveState_SaveScreenshot(); -extern bool SaveState_ZipToDisk(std::unique_ptr srclist, std::unique_ptr screenshot, const char* filename); +extern bool SaveState_ZipToDisk( + std::unique_ptr srclist, std::unique_ptr screenshot, + const char* filename, Error* error); extern bool SaveState_ReadScreenshot(const std::string& filename, u32* out_width, u32* out_height, std::vector* out_pixels); extern bool SaveState_UnzipFromDisk(const std::string& filename, Error* error); diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index b550ecd54c..9d3fd38ea0 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -1909,19 +1909,18 @@ void VMManager::ZipSaveState(std::unique_ptr elist, { Common::Timer timer; - if (SaveState_ZipToDisk(std::move(elist), std::move(screenshot), filename)) + Error error; + if (!SaveState_ZipToDisk(std::move(elist), std::move(screenshot), filename, &error)) { - if (slot_for_message >= 0 && VMManager::HasValidVM()) - { - Host::AddIconOSDMessage("SaveState", ICON_FA_FLOPPY_DISK, - fmt::format(TRANSLATE_FS("VMManager", "Saved state to slot {}."), slot_for_message), - Host::OSD_QUICK_DURATION); - } + error_callback(error.GetDescription()); + return; } - else + + if (slot_for_message >= 0 && VMManager::HasValidVM()) { - error_callback(fmt::format( - TRANSLATE_FS("VMManager", "Cannot zip state."), slot_for_message)); + Host::AddIconOSDMessage(fmt::format("SaveStateSlot{}", slot_for_message), ICON_FA_FLOPPY_DISK, + fmt::format(TRANSLATE_FS("VMManager", "Saved state to slot {}."), slot_for_message), + Host::OSD_QUICK_DURATION); } DevCon.WriteLn("Zipping save state to '%s' took %.2f ms", filename, timer.GetTimeMilliseconds());