From 754cf6da30582725b770142003d2d4e82ee1b265 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 20 May 2019 19:26:15 +0200 Subject: [PATCH] [d3d11] Validate subresource index in MapImage Fixes crashes when passing an invalid subresource index. --- src/d3d11/d3d11_context_def.cpp | 3 +++ src/d3d11/d3d11_context_imm.cpp | 3 +++ src/d3d11/d3d11_texture.h | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/src/d3d11/d3d11_context_def.cpp b/src/d3d11/d3d11_context_def.cpp index 4f1d63d35..24f75a418 100644 --- a/src/d3d11/d3d11_context_def.cpp +++ b/src/d3d11/d3d11_context_def.cpp @@ -214,6 +214,9 @@ namespace dxvk { Logger::err("D3D11: Cannot map a device-local image"); return E_INVALIDARG; } + + if (unlikely(Subresource >= pTexture->CountSubresources())) + return E_INVALIDARG; VkFormat packedFormat = m_parent->LookupPackedFormat( pTexture->Desc()->Format, pTexture->GetFormatMode()).Format; diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp index 199714d41..e3560aa45 100644 --- a/src/d3d11/d3d11_context_imm.cpp +++ b/src/d3d11/d3d11_context_imm.cpp @@ -339,6 +339,9 @@ namespace dxvk { return E_INVALIDARG; } + if (unlikely(Subresource >= pResource->CountSubresources())) + return E_INVALIDARG; + pResource->SetMapType(Subresource, MapType); VkFormat packedFormat = m_parent->LookupPackedFormat( diff --git a/src/d3d11/d3d11_texture.h b/src/d3d11/d3d11_texture.h index 19dabd5f8..33bff15db 100644 --- a/src/d3d11/d3d11_texture.h +++ b/src/d3d11/d3d11_texture.h @@ -74,6 +74,14 @@ namespace dxvk { const D3D11_COMMON_TEXTURE_DESC* Desc() const { return &m_desc; } + + /** + * \brief Counts number of subresources + * \returns Number of subresources + */ + UINT CountSubresources() const { + return m_desc.ArraySize * m_desc.MipLevels; + } /** * \brief Map mode