From fdb2fecd45e3935f13a3f2db01915bf1c4007a25 Mon Sep 17 00:00:00 2001 From: Eladash <18193363+elad335@users.noreply.github.com> Date: Sat, 25 Nov 2023 20:00:32 +0200 Subject: [PATCH] Savestates: Add errored state for compressed stream --- rpcs3/Emu/savestate_utils.cpp | 17 ++++++++++++++++- rpcs3/Emu/savestate_utils.hpp | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 413cc392da..0050dec870 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -459,6 +459,7 @@ void compressed_serialization_file_handler::initialize(utils::serial& ar) #pragma GCC diagnostic pop #endif m_write_inited = true; + m_errored = false; } else { @@ -482,6 +483,7 @@ void compressed_serialization_file_handler::initialize(utils::serial& ar) #endif ensure(inflateInit2(&m_zs, 16 + 15) == Z_OK); m_read_inited = true; + m_errored = false; } } @@ -491,6 +493,11 @@ bool compressed_serialization_file_handler::handle_file_op(utils::serial& ar, us { initialize(ar); + if (m_errored) + { + return false; + } + z_stream& m_zs = std::any_cast(m_stream); if (data) @@ -512,6 +519,7 @@ bool compressed_serialization_file_handler::handle_file_op(utils::serial& ar, us if (deflate(&m_zs, Z_NO_FLUSH) == Z_STREAM_ERROR || m_file->write(m_stream_data.data(), m_stream_data.size() - m_zs.avail_out) != m_stream_data.size() - m_zs.avail_out) { + m_errored = true; deflateEnd(&m_zs); //m_file->close(); break; @@ -534,6 +542,11 @@ bool compressed_serialization_file_handler::handle_file_op(utils::serial& ar, us initialize(ar); + if (m_errored) + { + return false; + } + if (!size) { return true; @@ -625,7 +638,7 @@ usz compressed_serialization_file_handler::read_at(utils::serial& ar, usz read_p { ensure(read_pos == ar.data.size() + ar.data_offset - size); - if (!size) + if (!size || m_errored) { return 0; } @@ -674,8 +687,10 @@ usz compressed_serialization_file_handler::read_at(utils::serial& ar, usz read_p [[fallthrough]]; } default: + m_errored = true; inflateEnd(&m_zs); m_read_inited = false; + sys_log.error("Failure of compressed data reading. (res=%d, read_size=0x%x, avail_in=0x%x, avail_out=0x%x, ar=%s)", res, read_size, m_zs.avail_in, m_zs.avail_out, ar); return read_size; } diff --git a/rpcs3/Emu/savestate_utils.hpp b/rpcs3/Emu/savestate_utils.hpp index a33915d815..6a4169e2ff 100644 --- a/rpcs3/Emu/savestate_utils.hpp +++ b/rpcs3/Emu/savestate_utils.hpp @@ -66,6 +66,7 @@ struct compressed_serialization_file_handler : utils::serialization_file_handler usz m_file_read_index = 0; bool m_write_inited = false; bool m_read_inited = false; + bool m_errored = false; std::any m_stream; explicit compressed_serialization_file_handler(fs::file&& file) noexcept