From de2944ba73141f1ebdef0c7e6f83c2c40b85f547 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Tue, 22 Oct 2019 20:05:14 -0700 Subject: Added validation and correction of IShaderVariable::SetArray arguments --- .../GraphicsEngine/include/ShaderResourceVariableBase.h | 16 ++++++++++++++++ .../include/ShaderResourceLayoutD3D11.h | 6 ++++++ .../GraphicsEngineD3D12/include/ShaderVariableD3D12.h | 2 ++ .../include/GLPipelineResourceLayout.h | 4 ++++ Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h | 2 ++ 5 files changed, 30 insertions(+) (limited to 'Graphics') diff --git a/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h b/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h index 2501bd86..5227f84a 100644 --- a/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h +++ b/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h @@ -306,6 +306,22 @@ bool VerifyResourceViewBinding(const ResourceAttribsType& Attribs, return BindingOK; } +inline void VerifyAndCorrectSetArrayArguments(const char* Name, Uint32 ArraySize, Uint32& FirstElement, Uint32& NumElements) +{ + if (FirstElement >= ArraySize) + { + LOG_ERROR_MESSAGE("SetArray arguments are invalid for '", Name,"' variable: FirstElement (", FirstElement, ") is out of allowed range 0 .. ", ArraySize-1); + FirstElement = ArraySize-1; + NumElements = 0; + } + + if (FirstElement + NumElements > ArraySize) + { + LOG_ERROR_MESSAGE("SetArray arguments are invalid for '", Name,"' variable: specified element range (", FirstElement, " .. ", + FirstElement + NumElements-1, ") is out of array bounds 0 .. ", ArraySize-1); + NumElements = ArraySize - FirstElement; + } +} struct DefaultShaderVariableIDComparator { diff --git a/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h b/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h index 5934e4c3..84caeaa8 100644 --- a/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h +++ b/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h @@ -83,6 +83,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -110,6 +111,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -141,6 +143,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -166,6 +169,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -192,6 +196,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -217,6 +222,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } diff --git a/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h b/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h index d3a80679..1670f6a6 100644 --- a/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h +++ b/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h @@ -61,6 +61,7 @@ #include "ShaderResourceVariableD3D.h" #include "ShaderResourceLayoutD3D12.h" +#include "ShaderResourceVariableBase.h" namespace Diligent { @@ -172,6 +173,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Resource.Attribs.Name, m_Resource.Attribs.BindCount, FirstElement, NumElements); for (Uint32 Elem = 0; Elem < NumElements; ++Elem) m_Resource.BindResource(ppObjects[Elem], FirstElement + Elem, m_ParentManager.m_ResourceCache); } diff --git a/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h b/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h index 6db22447..ddd79c38 100644 --- a/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h +++ b/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h @@ -157,6 +157,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -187,6 +188,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -216,6 +218,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } @@ -245,6 +248,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements); for(Uint32 elem=0; elem < NumElements; ++elem) BindResource(ppObjects[elem], FirstElement+elem); } diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h b/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h index 59ef0e21..cfaa41a8 100644 --- a/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h +++ b/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h @@ -58,6 +58,7 @@ #include #include "ShaderResourceLayoutVk.h" +#include "ShaderResourceVariableBase.h" namespace Diligent { @@ -170,6 +171,7 @@ public: virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { + VerifyAndCorrectSetArrayArguments(m_Resource.SpirvAttribs.Name, m_Resource.SpirvAttribs.ArraySize, FirstElement, NumElements); for (Uint32 Elem = 0; Elem < NumElements; ++Elem) m_Resource.BindResource(ppObjects[Elem], FirstElement + Elem, m_ParentManager.m_ResourceCache); } -- cgit v1.2.3