[PATCH 2/5] d3d11: Validate the feature level count in d3d11_device_CreateDeviceContextState().
Henri Verbeet
hverbeet at codeweavers.com
Mon Mar 15 10:11:34 CDT 2021
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d11/device.c | 22 +++++++++++++++++-----
dlls/d3d11/tests/d3d11.c | 12 +++++-------
2 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 4ae146b11a6..ff628eeaae1 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -4061,15 +4061,20 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateRasterizerState1(ID3D11Devic
}
static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDeviceContextState(ID3D11Device2 *iface, UINT flags,
- const D3D_FEATURE_LEVEL *feature_levels, UINT feature_levels_count, UINT sdk_version,
+ const D3D_FEATURE_LEVEL *feature_levels, UINT feature_level_count, UINT sdk_version,
REFIID emulated_interface, D3D_FEATURE_LEVEL *chosen_feature_level, ID3DDeviceContextState **state)
{
struct d3d_device *device = impl_from_ID3D11Device2(iface);
struct d3d_device_context_state *state_impl;
+ HRESULT hr = E_INVALIDARG;
FIXME("iface %p, flags %#x, feature_levels %p, feature_level_count %u, sdk_version %u, "
- "emulated_interface %s, chosen_feature_level %p, state %p semi-stub!\n", iface, flags, feature_levels,
- feature_levels_count, sdk_version, debugstr_guid(emulated_interface), chosen_feature_level, state);
+ "emulated_interface %s, chosen_feature_level %p, state %p semi-stub!\n",
+ iface, flags, feature_levels, feature_level_count, sdk_version,
+ debugstr_guid(emulated_interface), chosen_feature_level, state);
+
+ if (!feature_level_count)
+ goto fail;
if (chosen_feature_level)
FIXME("Device context state feature level not implemented yet.\n");
@@ -4078,8 +4083,8 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDeviceContextState(ID3D11Dev
{
if (!(state_impl = heap_alloc_zero(sizeof(*state_impl))))
{
- *state = NULL;
- return E_OUTOFMEMORY;
+ hr = E_OUTOFMEMORY;
+ goto fail;
}
d3d_device_context_state_init(state_impl, device, emulated_interface);
@@ -4089,6 +4094,13 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDeviceContextState(ID3D11Dev
device->d3d11_only = FALSE;
if (chosen_feature_level) *chosen_feature_level = ID3D11Device2_GetFeatureLevel(iface);
return state ? S_OK : S_FALSE;
+
+fail:
+ if (chosen_feature_level)
+ *chosen_feature_level = 0;
+ if (state)
+ *state = NULL;
+ return hr;
}
static HRESULT STDMETHODCALLTYPE d3d11_device_OpenSharedResource1(ID3D11Device2 *iface, HANDLE handle,
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 1b35e8f4983..acbd1856b08 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -6876,19 +6876,17 @@ static void test_device_context_state(void)
context_state = (void *)0xc0de0001;
hr = ID3D11Device1_CreateDeviceContextState(device, 0, &feature_level, 0,
D3D11_SDK_VERSION, &IID_ID3D11Device1, &selected_feature_level, &context_state);
- todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!selected_feature_level, "Got unexpected feature level %#x.\n", selected_feature_level);
- todo_wine ok(!context_state, "Got unexpected context state %p.\n", context_state);
- if (SUCCEEDED(hr))
- ID3DDeviceContextState_Release(context_state);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+ ok(!selected_feature_level, "Got unexpected feature level %#x.\n", selected_feature_level);
+ ok(!context_state, "Got unexpected context state %p.\n", context_state);
hr = ID3D11Device1_CreateDeviceContextState(device, 0, &feature_level,
0, D3D11_SDK_VERSION, &IID_ID3D11Device1, NULL, NULL);
- todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
hr = ID3D11Device1_CreateDeviceContextState(device, 0, NULL,
0, D3D11_SDK_VERSION, &IID_ID3D11Device1, NULL, NULL);
- todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
hr = ID3D11Device1_CreateDeviceContextState(device, 0, &feature_level,
1, D3D11_SDK_VERSION, &IID_ID3D11Device1, NULL, &context_state);
--
2.20.1
More information about the wine-devel
mailing list