mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #14699 from unknownbrackets/savestate
SaveState: Validate size matches measured
This commit is contained in:
commit
8fa52cd036
3 changed files with 9 additions and 7 deletions
|
@ -160,12 +160,13 @@ public:
|
||||||
|
|
||||||
// Expects ptr to have at least MeasurePtr bytes at ptr.
|
// Expects ptr to have at least MeasurePtr bytes at ptr.
|
||||||
template<class T>
|
template<class T>
|
||||||
static Error SavePtr(u8 *ptr, T &_class)
|
static Error SavePtr(u8 *ptr, T &_class, size_t expected_size)
|
||||||
{
|
{
|
||||||
|
const u8 *expected_end = ptr + expected_size;
|
||||||
PointerWrap p(&ptr, PointerWrap::MODE_WRITE);
|
PointerWrap p(&ptr, PointerWrap::MODE_WRITE);
|
||||||
_class.DoState(p);
|
_class.DoState(p);
|
||||||
|
|
||||||
if (p.error != p.ERROR_FAILURE) {
|
if (p.error != p.ERROR_FAILURE && (expected_end == ptr || expected_size == 0)) {
|
||||||
return ERROR_NONE;
|
return ERROR_NONE;
|
||||||
} else {
|
} else {
|
||||||
return ERROR_BROKEN_STATE;
|
return ERROR_BROKEN_STATE;
|
||||||
|
@ -201,7 +202,7 @@ public:
|
||||||
u8 *buffer = (u8 *)malloc(sz);
|
u8 *buffer = (u8 *)malloc(sz);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return ERROR_BAD_ALLOC;
|
return ERROR_BAD_ALLOC;
|
||||||
Error error = SavePtr(buffer, _class);
|
Error error = SavePtr(buffer, _class, sz);
|
||||||
|
|
||||||
// SaveFile takes ownership of buffer
|
// SaveFile takes ownership of buffer
|
||||||
if (error == ERROR_NONE)
|
if (error == ERROR_NONE)
|
||||||
|
|
|
@ -94,7 +94,7 @@ namespace SaveState
|
||||||
size_t sz = CChunkFileReader::MeasurePtr(state);
|
size_t sz = CChunkFileReader::MeasurePtr(state);
|
||||||
if (data.size() < sz)
|
if (data.size() < sz)
|
||||||
data.resize(sz);
|
data.resize(sz);
|
||||||
return CChunkFileReader::SavePtr(&data[0], state);
|
return CChunkFileReader::SavePtr(&data[0], state, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
CChunkFileReader::Error LoadFromRam(std::vector<u8> &data, std::string *errorString) {
|
CChunkFileReader::Error LoadFromRam(std::vector<u8> &data, std::string *errorString) {
|
||||||
|
|
|
@ -877,9 +877,10 @@ bool retro_serialize(void *data, size_t size)
|
||||||
if (useEmuThread)
|
if (useEmuThread)
|
||||||
EmuThreadPause(); // Does nothing if already paused
|
EmuThreadPause(); // Does nothing if already paused
|
||||||
|
|
||||||
assert(CChunkFileReader::MeasurePtr(state) <= size);
|
size_t measured = CChunkFileReader::MeasurePtr(state);
|
||||||
retVal = CChunkFileReader::SavePtr((u8 *)data, state)
|
assert(measured <= size);
|
||||||
== CChunkFileReader::ERROR_NONE;
|
auto err = CChunkFileReader::SavePtr((u8 *)data, state, measured);
|
||||||
|
retVal = err == CChunkFileReader::ERROR_NONE;
|
||||||
|
|
||||||
if (useEmuThread)
|
if (useEmuThread)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue