Fixed memory leak enumerating display modes on Windows

Fixes https://github.com/libsdl-org/SDL/issues/13233
This commit is contained in:
Sam Lantinga
2025-09-07 13:38:39 -07:00
parent 834b5ba7fb
commit 9116a56c13

View File

@@ -582,12 +582,12 @@ static void WIN_AddDisplay(SDL_VideoDevice *_this, HMONITOR hMonitor, const MONI
if (internal->state != DisplayRemoved) {
// We've already enumerated this display, don't move it
return;
goto cleanup;
}
if (index >= _this->num_displays) {
// This should never happen due to the check above, but just in case...
return;
goto cleanup;
}
if (moved) {
@@ -608,6 +608,8 @@ static void WIN_AddDisplay(SDL_VideoDevice *_this, HMONITOR hMonitor, const MONI
SDL_ResetFullscreenDisplayModes(existing_display);
SDL_SetDesktopDisplayMode(existing_display, &mode);
// The mode is owned by the video subsystem
mode.internal = NULL;
if (WIN_GetDisplayBounds(_this, existing_display, &bounds) &&
SDL_memcmp(&internal->bounds, &bounds, sizeof(bounds)) != 0) {
changed_bounds = true;
@@ -630,7 +632,7 @@ static void WIN_AddDisplay(SDL_VideoDevice *_this, HMONITOR hMonitor, const MONI
displaydata = (SDL_DisplayData *)SDL_calloc(1, sizeof(*displaydata));
if (!displaydata) {
return;
goto cleanup;
}
SDL_memcpy(displaydata->DeviceName, info->szDevice, sizeof(displaydata->DeviceName));
displaydata->MonitorHandle = hMonitor;
@@ -657,11 +659,19 @@ static void WIN_AddDisplay(SDL_VideoDevice *_this, HMONITOR hMonitor, const MONI
#ifdef HAVE_DXGI1_6_H
WIN_GetHDRProperties(_this, hMonitor, &display.HDR);
#endif
SDL_AddVideoDisplay(&display, false);
if (SDL_AddVideoDisplay(&display, false)) {
// The mode is owned by the video subsystem
mode.internal = NULL;
} else {
SDL_free(displaydata);
}
SDL_free(display.name);
done:
*display_index += 1;
cleanup:
SDL_free(mode.internal);
}
typedef struct _WIN_AddDisplaysData