From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/gdi32/tests/clipping.c | 6 +----- dlls/win32u/region.c | 7 ++++--- 2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/dlls/gdi32/tests/clipping.c b/dlls/gdi32/tests/clipping.c index acfe73632f1..1ee58afce12 100644 --- a/dlls/gdi32/tests/clipping.c +++ b/dlls/gdi32/tests/clipping.c @@ -226,7 +226,6 @@ static void test_ExtCreateRegion(void) rgn.data.rdh.dwSize = sizeof(rgn.data.rdh) + 1; SetLastError(0xdeadbeef); hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER), &rgn.data); - todo_wine ok(!hrgn, "ExtCreateRegion should fail\n"); ok((GetLastError() == 0xdeadbeef), "Expected: 0xdeadbeef, got %lu\n", GetLastError());
@@ -235,11 +234,9 @@ static void test_ExtCreateRegion(void) /* Number of bytes cannot be smaller than sizeof(RGNDATAHEADER) */ SetLastError(0xdeadbeef); hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) - 1, &rgn.data); - todo_wine ok(!hrgn, "ExtCreateRegion should fail\n"); - todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER || - broken(GetLastError() == 0xdeadbeef), "0xdeadbeef, got %lu\n", GetLastError()); + (GetLastError() == 0xdeadbeef), "0xdeadbeef, got %lu\n", GetLastError());
SetLastError(0xdeadbeef); hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data); @@ -277,7 +274,6 @@ static void test_ExtCreateRegion(void) /* Buffer cannot be smaller than sizeof(RGNDATAHEADER) + 2 * sizeof(RECT) */ SetLastError(0xdeadbeef); hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + 2 * sizeof(RECT) - 1, &rgn.data); - todo_wine ok(!hrgn, "ExtCreateRegion should fail\n"); ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %lu\n", GetLastError()); } diff --git a/dlls/win32u/region.c b/dlls/win32u/region.c index f32984d1c54..40a477ddfd1 100644 --- a/dlls/win32u/region.c +++ b/dlls/win32u/region.c @@ -896,11 +896,12 @@ HRGN WINAPI NtGdiExtCreateRegion( const XFORM *xform, DWORD count, const RGNDATA WINEREGION *obj; const RECT *pCurRect, *pEndRect;
- if (!rgndata || rgndata->rdh.dwSize < sizeof(RGNDATAHEADER)) + if (!rgndata || rgndata->rdh.dwSize != sizeof(RGNDATAHEADER) || + (count < sizeof(RGNDATAHEADER) + rgndata->rdh.nCount * sizeof(RECT))) return 0;
- /* XP doesn't care about the type */ - if( rgndata->rdh.iType != RDH_RECTANGLES ) + /* Up to Windows XP/2003, function return 0, if type is wrong */ + if (rgndata->rdh.iType != RDH_RECTANGLES) WARN("(Unsupported region data type: %u)\n", (int)rgndata->rdh.iType);
if (xform)