From 1ad182105b1f0d90d93ac087c220fa1f96cd6c91 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Tue, 17 Aug 2021 16:40:48 -0700 Subject: [PATCH] fix memory leak and possible nullptr read Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Assets/ScriptCanvasAssetHandler.cpp | 35 ++++++++++--------- .../GraphValidationDockWidget.cpp | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp index 3f5fd8441f..7a07902a11 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp @@ -88,9 +88,11 @@ namespace ScriptCanvasEditor { streamSource->Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); auto& scriptCanvasDataTarget = scriptCanvasAssetTarget->GetScriptCanvasData(); - AZStd::vector byteBuffer(streamSource->GetLength()); + AZStd::vector byteBuffer; + byteBuffer.resize_no_construct(streamSource->GetLength()); AZ::IO::ByteContainerStream byteStreamSource(&byteBuffer); const size_t bytesRead = streamSource->Read(byteBuffer.size(), byteBuffer.data()); + scriptCanvasDataTarget.m_scriptCanvasEntity.reset(nullptr); if (bytesRead == streamSource->GetLength()) { @@ -98,31 +100,30 @@ namespace ScriptCanvasEditor AZ::JsonDeserializerSettings settings; // \todo more mapping stuff needs to go in the settings settings.m_serializeContext = m_serializeContext; - byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); // attempt JSON deserialization... if (JSRU::LoadObjectFromStreamByType - ( &scriptCanvasDataTarget - , azrtti_typeid() - , byteStreamSource - , &settings).IsSuccess()) + ( &scriptCanvasDataTarget + , azrtti_typeid() + , byteStreamSource + , &settings).IsSuccess()) { return AZ::Data::AssetHandler::LoadResult::LoadComplete; } -#if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED) - else - { - // ...if there is a failure, check if it is saved in the old format - byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); - // tolerate unknown classes in the editor. Let the asset processor warn about bad nodes... - if (AZ::Utils::LoadObjectFromStreamInPlace(byteStreamSource, scriptCanvasAssetTarget->GetScriptCanvasData() + +#if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)//// + // ...if there is a failure, check if it is saved in the old format + byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); + // tolerate unknown classes in the editor. Let the asset processor warn about bad nodes... + if (AZ::Utils::LoadObjectFromStreamInPlace + ( byteStreamSource + , scriptCanvasDataTarget , m_serializeContext , AZ::ObjectStream::FilterDescriptor(assetLoadFilterCB, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES))) - { - return AZ::Data::AssetHandler::LoadResult::LoadComplete; - } + { + return AZ::Data::AssetHandler::LoadResult::LoadComplete; } +#endif//defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED) } -#endif } return AZ::Data::AssetHandler::LoadResult::Error; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidget.cpp index 6d29c01ff4..3400f2ea66 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidget.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidget.cpp @@ -734,7 +734,7 @@ namespace ScriptCanvasEditor { ui->statusTableView->clearSelection(); - if (auto model = GetActiveData().second->GetModel()) + if (auto model = GetActiveData().second ? GetActiveData().second->GetModel() : nullptr) { model->Clear(); model->RunValidation(m_activeGraphIds.scriptCanvasId);