Module: wine Branch: master Commit: b5603287b7d6cc38e2a90840271deaf90c788a6e URL: https://source.winehq.org/git/wine.git/?a=commit;h=b5603287b7d6cc38e2a908402...
Author: Zhiyi Zhang zzhang@codeweavers.com Date: Mon Feb 10 11:09:43 2020 +0800
user32: Fix ChangeDisplaySettingsExW() minimum size check.
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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);