From c3fe9ec2f74ed135df1fb08faf13730050734b95 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Thu, 20 Dec 2007 14:49:59 +0800 Subject: [PATCH] gdi32: Add a test for minimal acceptable DEVMODEA size, make it pass under Wine. --- dlls/gdi32/driver.c | 5 +++++ dlls/gdi32/tests/dc.c | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index a2aa033bd1e..31810b0f792 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -414,6 +414,11 @@ DEVMODEW * WINAPI GdiConvertToDevmodeW(const DEVMODEA *dmA) WORD dmW_size, dmA_size; dmA_size = dmA->dmSize; + + /* this is the minimal dmSize that XP accepts */ + if (dmA_size < FIELD_OFFSET(DEVMODEA, dmFields)) + return NULL; + if (dmA_size > sizeof(DEVMODEA)) dmA_size = sizeof(DEVMODEA); diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c index 60b6ad73ed1..01cb064ceef 100644 --- a/dlls/gdi32/tests/dc.c +++ b/dlls/gdi32/tests/dc.c @@ -222,6 +222,19 @@ static void test_GdiConvertToDevmodeW(void) "expected %04x, got %04x\n", FIELD_OFFSET(DEVMODEW, dmPanningHeight) + sizeof(dmW->dmPanningHeight), dmW->dmSize); HeapFree(GetProcessHeap(), 0, dmW); + + SetLastError(0xdeadbeef); + dmA.dmSize = 0; + dmW = pGdiConvertToDevmodeW(&dmA); + ok(!dmW, "GdiConvertToDevmodeW should fail\n"); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", GetLastError()); + + /* this is the minimal dmSize that XP accepts */ + dmA.dmSize = FIELD_OFFSET(DEVMODEA, dmFields); + dmW = pGdiConvertToDevmodeW(&dmA); + ok(dmW->dmSize == FIELD_OFFSET(DEVMODEW, dmFields), + "expected %04x, got %04x\n", FIELD_OFFSET(DEVMODEW, dmFields), dmW->dmSize); + HeapFree(GetProcessHeap(), 0, dmW); } START_TEST(dc) -- 2.11.4.GIT