Module: wine Branch: master Commit: 59a76b3a868c67c27c777b7bd4be85214612e957 URL: https://gitlab.winehq.org/wine/wine/-/commit/59a76b3a868c67c27c777b7bd4be852... Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Sep 14 11:32:30 2022 +0200 win32u: Lock display devices mutex in find_adapter. --- dlls/win32u/sysparams.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 2927c94f2a7..867332624d1 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2020,12 +2020,15 @@ static struct adapter *find_adapter( UNICODE_STRING *name ) struct display_device *device; struct adapter *adapter; + if (!lock_display_devices()) return NULL; + if (name && name->Length) device = find_adapter_device_by_name( name ); else device = find_adapter_device_by_id( 0 ); /* use primary adapter */ if (!device) adapter = NULL; else adapter = adapter_acquire( CONTAINING_RECORD( device, struct adapter, dev ) ); + unlock_display_devices(); return adapter; } @@ -2493,10 +2496,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm if ((!devname || !devname->Length) && !devmode) return apply_display_settings( NULL, NULL, hwnd, flags, lparam ); - if (!lock_display_devices()) return DISP_CHANGE_FAILED; - adapter = find_adapter( devname ); - unlock_display_devices(); - if (!adapter) return DISP_CHANGE_BADPARAM; + if (!(adapter = find_adapter( devname ))) return DISP_CHANGE_BADPARAM; if (!adapter_get_full_mode( adapter, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; else if ((flags & CDS_UPDATEREGISTRY) && !adapter_set_registry_settings( adapter, &full_mode )) ret = DISP_CHANGE_NOTUPDATED; @@ -2552,10 +2552,7 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM TRACE( "device %s, index %#x, devmode %p, flags %#x\n", debugstr_us(device), index, devmode, flags ); - if (!lock_display_devices()) return FALSE; - adapter = find_adapter( device ); - unlock_display_devices(); - if (!adapter) return FALSE; + if (!(adapter = find_adapter( device ))) return FALSE; lstrcpynW( devmode->dmDeviceName, wine_display_driverW, ARRAY_SIZE(devmode->dmDeviceName) ); devmode->dmSpecVersion = DM_SPECVERSION;