Stefan Dösinger : ddraw: Add a test for incorrect surface desc sizes for Lock().
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jun 22 07:35:44 CDT 2007
Module: wine
Branch: master
Commit: e019cebd1653fd7e18ec8c3645feefafb15f44e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e019cebd1653fd7e18ec8c3645feefafb15f44e3
Author: Stefan Dösinger <stefandoesinger at 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);
}
More information about the wine-cvs
mailing list