From 2468fccf7fa7fa315d6652c7babf85f2d09f035b Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 1 Aug 2023 18:28:55 -0700 Subject: [PATCH] Fixed crash if a display is enumerated twice This can happen if a monitor is in the process of becoming primary because another monitor was disconnected. (cherry picked from commit 07578fde3dad2dadd605f5b18399c8d021f6ae5d) --- src/video/windows/SDL_windowsmodes.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/video/windows/SDL_windowsmodes.c b/src/video/windows/SDL_windowsmodes.c index 69168c97a..438fcbe4a 100644 --- a/src/video/windows/SDL_windowsmodes.c +++ b/src/video/windows/SDL_windowsmodes.c @@ -318,10 +318,19 @@ static void WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEXW *info, if (SDL_wcscmp(driverdata->DeviceName, info->szDevice) == 0) { SDL_bool moved = (index != i); + if (driverdata->state != DisplayRemoved) { + /* We've already enumerated this display, don't move it */ + return; + } + + if (index >= _this->num_displays) { + /* This should never happen due to the check above, but just in case... */ + return; + } + if (moved) { SDL_VideoDisplay tmp; - SDL_assert(index < _this->num_displays); SDL_memcpy(&tmp, &_this->displays[index], sizeof(tmp)); SDL_memcpy(&_this->displays[index], &_this->displays[i], sizeof(tmp)); SDL_memcpy(&_this->displays[i], &tmp, sizeof(tmp));