Module: wine Branch: master Commit: e019cebd1653fd7e18ec8c3645feefafb15f44e3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e019cebd1653fd7e18ec8c3645...
Author: Stefan Dösinger stefandoesinger@gmx.at Date: Fri Jun 8 17:35:44 2007 +0200
ddraw: Add a test for incorrect surface desc sizes for Lock().
---
dlls/ddraw/surface.c | 15 ++++--------- dlls/ddraw/tests/dsurface.c | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 934999c..9608aef 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -582,17 +582,12 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, * for the supported values. The others are ignored by WineD3D */
- /* Hmm. Anarchy online passes an uninitialized surface descriptor, - * that means it doesn't have dwSize set. Init it to some sane - * value - */ - if(DDSD->dwSize <= sizeof(DDSURFACEDESC)) - { - DDSD->dwSize = sizeof(DDSURFACEDESC); - } - else + if(DDSD->dwSize != sizeof(DDSURFACEDESC) && + DDSD->dwSize != sizeof(DDSURFACEDESC2)) { - DDSD->dwSize = sizeof(DDSURFACEDESC2); + WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", DDERR_INVALIDPARAMS); + LeaveCriticalSection(&ddraw_cs); + return DDERR_INVALIDPARAMS; }
hr = IWineD3DSurface_LockRect(This->WineD3DSurface, diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index 55d7cbd..a02c1d3 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -2315,6 +2315,52 @@ static void StructSizeTest(void) hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr);
+ /* Tests for Lock() */ + + desc.desc1.dwSize = sizeof(DDSURFACEDESC); + hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); + ok(hr == DD_OK, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); + ok(desc.desc1.dwSize == sizeof(DDSURFACEDESC), "Destination size was changed to %d\n", desc.desc1.dwSize); + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + ok(hr == DD_OK, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); + ok(desc.desc2.dwSize == sizeof(DDSURFACEDESC), "Destination size was changed to %d\n", desc.desc1.dwSize); + + desc.desc2.dwSize = sizeof(DDSURFACEDESC2); + hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); + ok(hr == DD_OK, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr); + ok(desc.desc1.dwSize == sizeof(DDSURFACEDESC2), "Destination size was changed to %d\n", desc.desc1.dwSize); + if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + ok(hr == DD_OK, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); + ok(desc.desc2.dwSize == sizeof(DDSURFACEDESC2), "Destination size was changed to %d\n", desc.desc1.dwSize); + + desc.desc2.dwSize = 0; + hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Lock with desc size 0 returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_Lock with desc size 0 returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); + + desc.desc1.dwSize = sizeof(DDSURFACEDESC) + 1; + hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); + + desc.desc2.dwSize = sizeof(DDSURFACEDESC2) + 1; + hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr); + if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); + IDirectDrawSurface7_Release(surface7); IDirectDrawSurface_Release(surface1); }