[PATCH 3/3] user32: Fix ChangeDisplaySettingsExW() minimum size check.
Zhiyi Zhang
zzhang at codeweavers.com
Sun Feb 9 21:09:43 CST 2020
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/user32/sysparams.c | 16 ++++++----------
dlls/user32/tests/monitor.c | 4 ++--
2 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 0a0a2c70bd..a146f31071 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -3285,18 +3285,14 @@ LONG WINAPI ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, HWND
{
trace_devmode(devmode);
- /* This is the minimal dmSize that XP accepts */
- if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
- return DISP_CHANGE_FAILED;
+ if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmICMMethod))
+ return DISP_CHANGE_BADMODE;
- if (devmode->dmSize >= FIELD_OFFSET(DEVMODEW, dmFields) + sizeof(devmode->dmFields))
- {
- if (((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel) ||
- ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth) ||
- ((devmode->dmFields & DM_PELSHEIGHT) && devmode->dmPelsHeight) ||
- ((devmode->dmFields & DM_DISPLAYFREQUENCY) && devmode->dmDisplayFrequency))
+ if (((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel) ||
+ ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth) ||
+ ((devmode->dmFields & DM_PELSHEIGHT) && devmode->dmPelsHeight) ||
+ ((devmode->dmFields & DM_DISPLAYFREQUENCY) && devmode->dmDisplayFrequency))
def_mode = FALSE;
- }
}
if (def_mode)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 03fd6f3ec3..e669b2b82e 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -401,11 +401,11 @@ static void test_ChangeDisplaySettingsEx(void)
dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod) - 1;
res = ChangeDisplaySettingsW(&dmW, CDS_TEST);
- todo_wine ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsW returned %d, expect DISP_CHANGE_BADMODE\n", res);
+ ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsW returned %d, expect DISP_CHANGE_BADMODE\n", res);
dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod) - 1;
res = ChangeDisplaySettingsExW(NULL, &dmW, NULL, CDS_TEST, NULL);
- todo_wine ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsExW returned %d, expect DISP_CHANGE_BADMODE\n", res);
+ ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsExW returned %d, expect DISP_CHANGE_BADMODE\n", res);
dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod);
res = ChangeDisplaySettingsW(&dmW, CDS_TEST);
--
2.20.1
More information about the wine-devel
mailing list