From 7df193676e8de9c9b760ceb10206c81f6b7fe592 Mon Sep 17 00:00:00 2001 From: David Adam Date: Sat, 19 Apr 2008 20:12:48 +0200 Subject: [PATCH] wined3d: Fix a possible null dereference. --- dlls/d3d8/tests/device.c | 37 +++++++++++++++++++++++++++++++++++++ dlls/d3d9/tests/device.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/wined3d/device.c | 2 ++ 3 files changed, 75 insertions(+) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 8de4ec762af..8617c0c7aec 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -1281,6 +1281,42 @@ static void test_render_zero_triangles(void) if(d3d8) IDirect3D8_Release(d3d8); } +static void test_set_material(void) +{ + D3DPRESENT_PARAMETERS present_parameters; + IDirect3DDevice8 *device = NULL; + IDirect3D8 *d3d8; + HWND hwnd; + HRESULT hr; + + d3d8 = pDirect3DCreate8( D3D_SDK_VERSION ); + ok(d3d8 != NULL, "Failed to create IDirect3D8 object\n"); + hwnd = CreateWindow( "static", "d3d8_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL ); + ok(hwnd != NULL, "Failed to create window\n"); + if (!d3d8 || !hwnd) goto cleanup; + + ZeroMemory(&present_parameters, sizeof(present_parameters)); + present_parameters.Windowed = TRUE; + present_parameters.hDeviceWindow = hwnd; + present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; + + hr = IDirect3D8_CreateDevice( d3d8, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, + D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &present_parameters, &device ); + ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE, "IDirect3D8_CreateDevice failed with %s\n", DXGetErrorString8(hr)); + if(!device) + { + skip("Failed to create a d3d device\n"); + goto cleanup; + } + + hr = IDirect3DDevice8_SetMaterial(device, NULL); + ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %s\n", DXGetErrorString8(hr)); + + cleanup: + if(device) IDirect3DDevice8_Release(device); + if(d3d8) IDirect3D8_Release(d3d8); +} + START_TEST(device) { HMODULE d3d8_handle = LoadLibraryA( "d3d8.dll" ); @@ -1306,5 +1342,6 @@ START_TEST(device) test_limits(); test_lights(); test_render_zero_triangles(); + test_set_material(); } } diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 020b17a8edb..8f4542aa4fa 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -1994,6 +1994,41 @@ static void test_display_formats() if(d3d9) IDirect3D9_Release(d3d9); } +static void test_set_material(void) +{ + D3DPRESENT_PARAMETERS present_parameters; + IDirect3DDevice9 *device = NULL; + IDirect3D9 *d3d9; + HWND hwnd; + HRESULT hr; + + d3d9 = pDirect3DCreate9( D3D_SDK_VERSION ); + ok(d3d9 != NULL, "Failed to create IDirect3D9 object\n"); + hwnd = CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL ); + ok(hwnd != NULL, "Failed to create window\n"); + if (!d3d9 || !hwnd) goto cleanup; + + ZeroMemory(&present_parameters, sizeof(present_parameters)); + present_parameters.Windowed = TRUE; + present_parameters.hDeviceWindow = hwnd; + present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; + + IDirect3D9_CreateDevice( d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, + D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &present_parameters, &device ); + if(!device) + { + skip("Failed to create a d3d device\n"); + goto cleanup; + } + + hr = IDirect3DDevice9_SetMaterial(device, NULL); + ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %s\n", DXGetErrorString9(hr)); + + cleanup: + if(device) IDirect3DDevice9_Release(device); + if(d3d9) IDirect3D9_Release(d3d9); +} + START_TEST(device) { HMODULE d3d9_handle = LoadLibraryA( "d3d9.dll" ); @@ -2023,5 +2058,6 @@ START_TEST(device) test_vertex_buffer_alignment(); test_lights(); test_set_stream_source(); + test_set_material(); } } diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 53d669efd5f..c8eafc89270 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3086,6 +3086,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetClipStatus(IWineD3DDevice *iface, static HRESULT WINAPI IWineD3DDeviceImpl_SetMaterial(IWineD3DDevice *iface, CONST WINED3DMATERIAL* pMaterial) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + if (!pMaterial) return WINED3DERR_INVALIDCALL; + This->updateStateBlock->changed.material = TRUE; This->updateStateBlock->material = *pMaterial;