[PATCH] gdi32: Update expected ExtCreateRegion behavior to represent newer Windows.

Sven Baars sven.wine at gmail.com
Sun Oct 27 06:42:38 CDT 2019


Signed-off-by: Sven Baars <sven.wine at gmail.com>
---
 dlls/gdi32/region.c         |  2 +-
 dlls/gdi32/tests/clipping.c | 37 ++++++-------------------------------
 2 files changed, 7 insertions(+), 32 deletions(-)

diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c
index 93238b5a84..5b786ec838 100644
--- a/dlls/gdi32/region.c
+++ b/dlls/gdi32/region.c
@@ -953,7 +953,7 @@ HRGN WINAPI ExtCreateRegion( const XFORM* lpXform, DWORD dwCount, const RGNDATA*
     WINEREGION *obj;
     const RECT *pCurRect, *pEndRect;
 
-    if (!rgndata)
+    if (!rgndata || dwCount < sizeof(RGNDATAHEADER))
     {
         SetLastError( ERROR_INVALID_PARAMETER );
         return 0;
diff --git a/dlls/gdi32/tests/clipping.c b/dlls/gdi32/tests/clipping.c
index d04ef77ca3..1160d66479 100644
--- a/dlls/gdi32/tests/clipping.c
+++ b/dlls/gdi32/tests/clipping.c
@@ -182,13 +182,10 @@ static void test_ExtCreateRegion(void)
     HRGN hrgn;
     XFORM xform;
 
-    if (0) /* crashes under Win9x */
-    {
-        SetLastError(0xdeadbeef);
-        hrgn = ExtCreateRegion(NULL, 0, NULL);
-        ok(!hrgn, "ExtCreateRegion should fail\n");
-        ok(GetLastError() == ERROR_INVALID_PARAMETER, "ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
-    }
+    SetLastError(0xdeadbeef);
+    hrgn = ExtCreateRegion(NULL, 0, NULL);
+    ok(!hrgn, "ExtCreateRegion should fail\n");
+    ok(GetLastError() == ERROR_INVALID_PARAMETER, "ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
 
     rgn.data.rdh.dwSize = 0;
     rgn.data.rdh.iType = 0;
@@ -223,9 +220,9 @@ static void test_ExtCreateRegion(void)
     /* Cannot be smaller than sizeof(RGNDATAHEADER) */
     SetLastError(0xdeadbeef);
     hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) - 1, &rgn.data);
-    todo_wine
     ok(!hrgn, "ExtCreateRegion should fail\n");
-    ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %u\n", GetLastError());
+    ok(GetLastError() == ERROR_INVALID_PARAMETER ||
+       broken(GetLastError() == 0xdeadbeef), "0xdeadbeef, got %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data);
@@ -237,32 +234,12 @@ static void test_ExtCreateRegion(void)
     SetRectEmpty(&rgn.data.rdh.rcBound);
     memcpy(rgn.data.Buffer, &rc, sizeof(rc));
 
-    /* With a single rect this seems to work... */
-    SetLastError(0xdeadbeef);
-    hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + sizeof(RECT) - 1, &rgn.data);
-    ok(hrgn != 0, "ExtCreateRegion error %u\n", GetLastError());
-    verify_region(hrgn, &rc);
-    DeleteObject(hrgn);
-
     SetLastError(0xdeadbeef);
     hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data);
     ok(hrgn != 0, "ExtCreateRegion error %u\n", GetLastError());
     verify_region(hrgn, &rc);
     DeleteObject(hrgn);
 
-    rgn.data.rdh.dwSize = sizeof(rgn.data.rdh) + 1;
-
-    SetLastError(0xdeadbeef);
-    hrgn = ExtCreateRegion(NULL, 1, &rgn.data);
-    ok(hrgn != 0 ||
-       broken(GetLastError() == 0xdeadbeef), /* NT4 */
-       "ExtCreateRegion error %u\n", GetLastError());
-    if(hrgn)
-    {
-        verify_region(hrgn, &rc);
-        DeleteObject(hrgn);
-    }
-
     xform.eM11 = 0.5; /* 50% width */
     xform.eM12 = 0.0;
     xform.eM21 = 0.0;
@@ -270,8 +247,6 @@ static void test_ExtCreateRegion(void)
     xform.eDx = 20.0;
     xform.eDy = 40.0;
 
-    rgn.data.rdh.dwSize = sizeof(rgn.data.rdh);
-
     SetLastError(0xdeadbeef);
     hrgn = ExtCreateRegion(&xform, sizeof(rgn), &rgn.data);
     ok(hrgn != 0, "ExtCreateRegion error %u/%x\n", GetLastError(), GetLastError());
-- 
2.17.1




More information about the wine-devel mailing list