Grigory Vasilyev (@h0tc0d3) commented about dlls/win32u/winstation.c:
BOOL is_virtual_desktop(void) {
- HANDLE desktop = NtUserGetThreadDesktop( GetCurrentThreadId() );
- USEROBJECTFLAGS flags = {0};
- DWORD len;
- struct object_lock lock = OBJECT_LOCK_INIT;
- const desktop_shm_t *desktop_shm;
- BOOL ret = FALSE;
- UINT status;
- if (!NtUserGetObjectInformation( desktop, UOI_FLAGS, &flags, sizeof(flags), &len )) return FALSE;
- return !!(flags.dwFlags & DF_WINE_VIRTUAL_DESKTOP);
- while ((status = get_shared_desktop( &lock, &desktop_shm )) == STATUS_PENDING)
ret = !!(desktop_shm->flags & DF_WINE_VIRTUAL_DESKTOP);
Can we get an incorrect pointer in desktop_shm, for example NULL, which will lead to null pointer dereference? It's probably better to move to ELSE after checking the status. ```C if (status) ret = FALSE; else ret = !!(desktop_shm->flags & DF_WINE_VIRTUAL_DESKTOP); ```