Module: wine Branch: master Commit: 7df193676e8de9c9b760ceb10206c81f6b7fe592 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7df193676e8de9c9b760ceb102...
Author: David Adam david.adam.cnrs@gmail.com Date: Sat Apr 19 20:12:48 2008 +0200
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(+), 0 deletions(-)
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 8de4ec7..8617c0c 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 020b17a..8f4542a 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 53d669e..c8eafc8 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;