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