diff --git a/Common/Serialize/Serializer.cpp b/Common/Serialize/Serializer.cpp index a7e8e2d909..e17a3742af 100644 --- a/Common/Serialize/Serializer.cpp +++ b/Common/Serialize/Serializer.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include #include @@ -513,13 +512,13 @@ CChunkFileReader::Error CChunkFileReader::LoadFile(const Path &filename, std::st } if (SerializeCompressType(header.Compress) == SerializeCompressType::ZSTD) { - u8 *uncomp_buffer = new (std::nothrow) u8[header.UncompressedSize]; + u8 *uncomp_buffer = (u8 *)malloc(header.UncompressedSize); if (!uncomp_buffer) { return ERROR_BAD_FILE; } if (!DecompressZstdFromFile(pFile, header.ExpectedSize, uncomp_buffer, header.UncompressedSize)) { ERROR_LOG(Log::SaveState, "ChunkReader: Failed to decompress file"); - delete [] uncomp_buffer; + free(uncomp_buffer); return ERROR_BAD_FILE; } _buffer = uncomp_buffer; @@ -530,18 +529,18 @@ CChunkFileReader::Error CChunkFileReader::LoadFile(const Path &filename, std::st // Uncompressed, or snappy (older states). sz = header.ExpectedSize; - u8 *buffer = new (std::nothrow) u8[sz]; + u8 *buffer = (u8 *)malloc(sz); if (!buffer || !pFile.ReadBytes(buffer, sz)) { ERROR_LOG(Log::SaveState, "ChunkReader: Error reading file"); - delete [] buffer; + free(buffer); return ERROR_BAD_FILE; } if (header.Compress) { - u8 *uncomp_buffer = new (std::nothrow) u8[header.UncompressedSize]; + u8 *uncomp_buffer = (u8 *)malloc(header.UncompressedSize); if (!uncomp_buffer) { - delete [] buffer; + free(buffer); return ERROR_BAD_FILE; } size_t uncomp_size = header.UncompressedSize; @@ -554,19 +553,19 @@ CChunkFileReader::Error CChunkFileReader::LoadFile(const Path &filename, std::st } if (!success) { ERROR_LOG(Log::SaveState, "ChunkReader: Failed to decompress file"); - delete [] uncomp_buffer; - delete [] buffer; + free(uncomp_buffer); + free(buffer); return ERROR_BAD_FILE; } if ((u32)uncomp_size != header.UncompressedSize) { ERROR_LOG(Log::SaveState, "Size mismatch: file: %u calc: %u", header.UncompressedSize, (u32)uncomp_size); - delete [] uncomp_buffer; - delete [] buffer; + free(uncomp_buffer); + free(buffer); return ERROR_BAD_FILE; } _buffer = uncomp_buffer; sz = uncomp_size; - delete [] buffer; + free(buffer); } else { _buffer = buffer; } diff --git a/Common/Serialize/Serializer.h b/Common/Serialize/Serializer.h index 8a27297dc5..c132c62028 100644 --- a/Common/Serialize/Serializer.h +++ b/Common/Serialize/Serializer.h @@ -303,7 +303,7 @@ public: if (error == ERROR_NONE) { failureReason->clear(); error = LoadPtr(ptr, sz, _class, failureReason); - delete [] ptr; + free(ptr); INFO_LOG(Log::SaveState, "ChunkReader: Done loading '%s'", filename.c_str()); } else { WARN_LOG(Log::SaveState, "ChunkReader: Error found during load of '%s'", filename.c_str()); @@ -359,6 +359,7 @@ public: // The file half of Load() and Save(), for doing it away from the state itself. LoadFile hands back // a new[]'d buffer; SaveFile takes ownership of a malloc'd one (as from MeasureAndSavePtr). + // The buffer is allocated with malloc (so the allocation can fail cleanly), free it with free(). static Error LoadFile(const Path &filename, std::string *gitVersion, u8 *&buffer, size_t &sz); // Reads only the first size bytes of the state, decompressing no more than that. Not for snappy // compressed (old) states. diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 836cbacba7..993ada0088 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -122,7 +122,8 @@ enum class OperationType { struct PendingRead { std::atomic done{ false }; CChunkFileReader::Error error = CChunkFileReader::ERROR_NONE; - std::unique_ptr buffer; + // From LoadFile, so malloc'd. + std::unique_ptr buffer{ nullptr, &free }; size_t size = 0; std::string gitVersion; // "PPSSPP " from the header, for the failure message.