[PATCH 5/6] d3d11: Improve arguments validation in d3d10_device_CreateGeometryShaderWithStreamOutput().
Józef Kucia
jkucia at codeweavers.com
Tue Apr 4 05:35:57 CDT 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/d3d11/device.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 13bfda4..1b7badd 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -4928,7 +4928,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShaderWithStreamOutp
UINT output_stream_decl_count, UINT output_stream_stride, ID3D10GeometryShader **shader)
{
struct d3d_device *device = impl_from_ID3D10Device(iface);
- D3D11_SO_DECLARATION_ENTRY *so_entries;
+ D3D11_SO_DECLARATION_ENTRY *so_entries = NULL;
struct d3d_geometry_shader *object;
unsigned int i, stride_count = 1;
HRESULT hr;
@@ -4938,9 +4938,18 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShaderWithStreamOutp
iface, byte_code, byte_code_length, output_stream_decls,
output_stream_decl_count, output_stream_stride, shader);
- if (!(so_entries = d3d11_calloc(output_stream_decl_count, sizeof(*so_entries))))
+ if (!output_stream_decl_count && output_stream_stride)
+ {
+ WARN("Stride must be 0 when declaration entry count is 0.\n");
+ *shader = NULL;
+ return E_INVALIDARG;
+ }
+
+ if (output_stream_decl_count
+ && !(so_entries = d3d11_calloc(output_stream_decl_count, sizeof(*so_entries))))
{
ERR("Failed to allocate D3D11 SO declaration array memory.\n");
+ *shader = NULL;
return E_OUTOFMEMORY;
}
@@ -4954,14 +4963,26 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShaderWithStreamOutp
so_entries[i].OutputSlot = output_stream_decls[i].OutputSlot;
if (output_stream_decls[i].OutputSlot)
- stride_count = 0;
+ {
+ stride_count = 0;
+ if (output_stream_stride)
+ {
+ WARN("Stride must be 0 when multiple output slots are used.\n");
+ HeapFree(GetProcessHeap(), 0, so_entries);
+ *shader = NULL;
+ return E_INVALIDARG;
+ }
+ }
}
hr = d3d_geometry_shader_create(device, byte_code, byte_code_length,
so_entries, output_stream_decl_count, &output_stream_stride, stride_count, 0, &object);
HeapFree(GetProcessHeap(), 0, so_entries);
if (FAILED(hr))
+ {
+ *shader = NULL;
return hr;
+ }
*shader = &object->ID3D10GeometryShader_iface;
--
2.10.2
More information about the wine-patches
mailing list