From: Ziqing Hui zhui@codeweavers.com
Passing NULL data to D3D10CreateEffectFromMemory crashes. Passing NULL data to D3D10CreateEffectPoolFromMemory returns E_INVALIDARG. --- dlls/d3d10/effect.c | 6 ++++++ dlls/d3d10/tests/effect.c | 7 ------- 2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c index 84ecfdcbbab..a9c8eaed5e8 100644 --- a/dlls/d3d10/effect.c +++ b/dlls/d3d10/effect.c @@ -9537,6 +9537,9 @@ static HRESULT d3d10_create_effect(void *data, SIZE_T data_size, ID3D10Device *d struct d3d10_effect *object; HRESULT hr;
+ if (!device) + return D3DERR_INVALIDCALL; + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
@@ -9636,6 +9639,9 @@ HRESULT WINAPI D3D10CreateEffectPoolFromMemory(void *data, SIZE_T data_size, UIN TRACE("data %p, data_size %Iu, fx_flags %#x, device %p, effect_pool %p.\n", data, data_size, fx_flags, device, effect_pool);
+ if (!data) + return E_INVALIDARG; + if (FAILED(hr = d3d10_create_effect(data, data_size, device, NULL, D3D10_EFFECT_IS_POOL, &object))) { diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c index c25d3288b52..a13ef2bfb91 100644 --- a/dlls/d3d10/tests/effect.c +++ b/dlls/d3d10/tests/effect.c @@ -7114,14 +7114,10 @@ static void test_effect_pool(void) ok(!!device2, "Failed to create d3d device.\n");
hr = D3D10CreateEffectPoolFromMemory(NULL, 0, 0, device, &pool); - todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr);
- if (strcmp(winetest_platform, "wine")) /* Crash on wine. */ - { hr = create_effect_pool(fx_test_pool, NULL, &pool); ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#lx.\n", hr); - }
hr = create_effect_pool(fx_test_pool, device, &pool); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); @@ -8267,12 +8263,9 @@ static void test_effect_data(void)
memcpy(buffer, fx_test_ecbt, sizeof(fx_test_ecbt));
- if (strcmp(winetest_platform, "wine")) /* Crash on wine. */ - { hr = create_effect(buffer, 0, NULL, NULL, &effect); ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#lx.\n", hr); ok(!memcmp(buffer, fx_test_ecbt, sizeof(fx_test_ecbt)), "Data is not modified.\n"); - }
hr = create_effect(buffer, 0, device, NULL, &effect); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);