SaveState: Fail load on decompression error.

Simply checking the size isn't enough, because it doesn't write the
decompressed size in the case of invalid data.

May help the crash in #11890.
This commit is contained in:
Unknown W. Brackets
2019-06-23 11:25:27 -07:00
parent 8c282db225
commit eaba867f28
+10 -2
View File
@@ -249,19 +249,27 @@ CChunkFileReader::Error CChunkFileReader::LoadFile(const std::string &filename,
return ERROR_BAD_FILE;
}
_buffer = buffer;
if (header.Compress) {
u8 *uncomp_buffer = new u8[header.UncompressedSize];
size_t uncomp_size = header.UncompressedSize;
snappy_uncompress((const char *)buffer, sz, (char *)uncomp_buffer, &uncomp_size);
auto status = snappy_uncompress((const char *)buffer, sz, (char *)uncomp_buffer, &uncomp_size);
if (status != SNAPPY_OK) {
ERROR_LOG(SAVESTATE, "ChunkReader: Failed to decompress file");
delete [] uncomp_buffer;
delete [] buffer;
return ERROR_BAD_FILE;
}
if ((u32)uncomp_size != header.UncompressedSize) {
ERROR_LOG(SAVESTATE, "Size mismatch: file: %u calc: %u", header.UncompressedSize, (u32)uncomp_size);
delete [] uncomp_buffer;
delete [] buffer;
return ERROR_BAD_FILE;
}
_buffer = uncomp_buffer;
sz = uncomp_size;
delete [] buffer;
} else {
_buffer = buffer;
}
if (header.GitVersion[31]) {