From f21accd4662b5c728a09f2b1119c997850c16993 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 15 Aug 2025 14:19:59 +0200 Subject: [PATCH] Fix crash when memory stream reading fails and perform soft error handling #3612 --- Source/Engine/Content/Assets/Animation.cpp | 2 +- Source/Engine/Content/Assets/Model.cpp | 4 ++-- Source/Engine/Content/Assets/ModelBase.cpp | 2 +- Source/Engine/Content/Assets/SkinnedModel.cpp | 2 +- Source/Engine/Serialization/MemoryReadStream.cpp | 6 +++++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Content/Assets/Animation.cpp b/Source/Engine/Content/Assets/Animation.cpp index 54c4d898e..62fc737dc 100644 --- a/Source/Engine/Content/Assets/Animation.cpp +++ b/Source/Engine/Content/Assets/Animation.cpp @@ -531,7 +531,7 @@ bool Animation::SaveHeader(const ModelData& modelData, WriteStream& stream, int3 // Nested animations stream.WriteInt32(0); // Empty list - return false; + return stream.HasError(); } void Animation::GetReferences(Array& assets, Array& files) const diff --git a/Source/Engine/Content/Assets/Model.cpp b/Source/Engine/Content/Assets/Model.cpp index 246bee3b4..32a610206 100644 --- a/Source/Engine/Content/Assets/Model.cpp +++ b/Source/Engine/Content/Assets/Model.cpp @@ -395,7 +395,7 @@ bool Model::LoadHeader(ReadStream& stream, byte& headerVersion) } } - return false; + return stream.HasError(); } #if USE_EDITOR @@ -454,7 +454,7 @@ bool Model::SaveHeader(WriteStream& stream, const ModelData& modelData) } } - return false; + return stream.HasError(); } bool Model::Save(bool withMeshDataFromGpu, Function& getChunk) const diff --git a/Source/Engine/Content/Assets/ModelBase.cpp b/Source/Engine/Content/Assets/ModelBase.cpp index e993bbec6..2db652424 100644 --- a/Source/Engine/Content/Assets/ModelBase.cpp +++ b/Source/Engine/Content/Assets/ModelBase.cpp @@ -329,7 +329,7 @@ bool ModelBase::LoadHeader(ReadStream& stream, byte& headerVersion) stream.Read(slot.Name, 11); } - return false; + return stream.HasError(); } bool ModelBase::LoadMesh(MemoryReadStream& stream, byte meshVersion, MeshBase* mesh, MeshData* dataIfReadOnly) diff --git a/Source/Engine/Content/Assets/SkinnedModel.cpp b/Source/Engine/Content/Assets/SkinnedModel.cpp index 9ca530a53..ac72dba59 100644 --- a/Source/Engine/Content/Assets/SkinnedModel.cpp +++ b/Source/Engine/Content/Assets/SkinnedModel.cpp @@ -656,7 +656,7 @@ bool SkinnedModel::LoadHeader(ReadStream& stream, byte& headerVersion) } } - return false; + return stream.HasError(); } #if USE_EDITOR diff --git a/Source/Engine/Serialization/MemoryReadStream.cpp b/Source/Engine/Serialization/MemoryReadStream.cpp index b84cb3af6..e6a1acea1 100644 --- a/Source/Engine/Serialization/MemoryReadStream.cpp +++ b/Source/Engine/Serialization/MemoryReadStream.cpp @@ -61,7 +61,11 @@ void MemoryReadStream::ReadBytes(void* data, uint32 bytes) { if (bytes > 0) { - ASSERT(data && GetLength() - GetPosition() >= bytes); + if (!data || GetLength() - GetPosition() < bytes) + { + _hasError = true; + return; + } Platform::MemoryCopy(data, _position, bytes); _position += bytes; }