Savestates: Add errored state for compressed stream

This commit is contained in:
Eladash 2023-11-25 20:00:32 +02:00 committed by Elad Ashkenazi
parent a0b521ba8e
commit fdb2fecd45
2 changed files with 17 additions and 1 deletions

View File

@ -459,6 +459,7 @@ void compressed_serialization_file_handler::initialize(utils::serial& ar)
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif
m_write_inited = true; m_write_inited = true;
m_errored = false;
} }
else else
{ {
@ -482,6 +483,7 @@ void compressed_serialization_file_handler::initialize(utils::serial& ar)
#endif #endif
ensure(inflateInit2(&m_zs, 16 + 15) == Z_OK); ensure(inflateInit2(&m_zs, 16 + 15) == Z_OK);
m_read_inited = true; 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); initialize(ar);
if (m_errored)
{
return false;
}
z_stream& m_zs = std::any_cast<z_stream&>(m_stream); z_stream& m_zs = std::any_cast<z_stream&>(m_stream);
if (data) 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) 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); deflateEnd(&m_zs);
//m_file->close(); //m_file->close();
break; break;
@ -534,6 +542,11 @@ bool compressed_serialization_file_handler::handle_file_op(utils::serial& ar, us
initialize(ar); initialize(ar);
if (m_errored)
{
return false;
}
if (!size) if (!size)
{ {
return true; 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); ensure(read_pos == ar.data.size() + ar.data_offset - size);
if (!size) if (!size || m_errored)
{ {
return 0; return 0;
} }
@ -674,8 +687,10 @@ usz compressed_serialization_file_handler::read_at(utils::serial& ar, usz read_p
[[fallthrough]]; [[fallthrough]];
} }
default: default:
m_errored = true;
inflateEnd(&m_zs); inflateEnd(&m_zs);
m_read_inited = false; 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; return read_size;
} }

View File

@ -66,6 +66,7 @@ struct compressed_serialization_file_handler : utils::serialization_file_handler
usz m_file_read_index = 0; usz m_file_read_index = 0;
bool m_write_inited = false; bool m_write_inited = false;
bool m_read_inited = false; bool m_read_inited = false;
bool m_errored = false;
std::any m_stream; std::any m_stream;
explicit compressed_serialization_file_handler(fs::file&& file) noexcept explicit compressed_serialization_file_handler(fs::file&& file) noexcept