From b07f8e987b62dbdad9be4e275579cf0b58ca8be9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 29 Jan 2023 21:57:30 -0800 Subject: [PATCH] Fixed checking the return values of SDL_AddBasicVideoDisplay() and SDL_AddVideoDisplay() Also fixed Wayland and Windows usage of SDL_DelVideoDisplay() https://github.com/libsdl-org/SDL/issues/7192 --- src/video/dummy/SDL_nullvideo.c | 2 +- src/video/emscripten/SDL_emscriptenvideo.c | 2 +- src/video/kmsdrm/SDL_kmsdrmvideo.c | 5 ++++- src/video/n3ds/SDL_n3dsvideo.c | 3 +-- src/video/ngage/SDL_ngagevideo.cpp | 2 +- src/video/offscreen/SDL_offscreenvideo.c | 2 +- src/video/psp/SDL_pspvideo.c | 7 ++++--- src/video/riscos/SDL_riscosmodes.c | 5 ++++- src/video/uikit/SDL_uikitmodes.m | 5 +++-- src/video/vivante/SDL_vivantevideo.c | 4 +++- src/video/wayland/SDL_waylandvideo.c | 2 +- src/video/windows/SDL_windowsmodes.c | 5 +++-- src/video/winrt/SDL_winrtvideo.cpp | 4 ++-- src/video/x11/SDL_x11modes.c | 10 +++++++--- 14 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/video/dummy/SDL_nullvideo.c b/src/video/dummy/SDL_nullvideo.c index 7f33b9c7ab..bc3be65a50 100644 --- a/src/video/dummy/SDL_nullvideo.c +++ b/src/video/dummy/SDL_nullvideo.c @@ -146,7 +146,7 @@ int DUMMY_VideoInit(_THIS) mode.format = SDL_PIXELFORMAT_RGB888; mode.pixel_w = 1024; mode.pixel_h = 768; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { + if (SDL_AddBasicVideoDisplay(&mode) == 0) { return -1; } diff --git a/src/video/emscripten/SDL_emscriptenvideo.c b/src/video/emscripten/SDL_emscriptenvideo.c index f61c422546..368483d92e 100644 --- a/src/video/emscripten/SDL_emscriptenvideo.c +++ b/src/video/emscripten/SDL_emscriptenvideo.c @@ -132,7 +132,7 @@ int Emscripten_VideoInit(_THIS) emscripten_get_screen_size(&mode.screen_w, &mode.screen_h); mode.display_scale = emscripten_get_device_pixel_ratio(); - if (SDL_AddBasicVideoDisplay(&mode) < 0) { + if (SDL_AddBasicVideoDisplay(&mode) == 0) { return -1; } diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index ae085f74de..442e7c8cab 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -879,7 +879,10 @@ static void KMSDRM_AddDisplay(_THIS, drmModeConnector *connector, drmModeRes *re display.current_mode = display.desktop_mode; /* Add the display to the list of SDL displays. */ - SDL_AddVideoDisplay(&display, SDL_FALSE); + if (SDL_AddVideoDisplay(&display, SDL_FALSE) == 0) { + ret = -1; + goto cleanup; + } cleanup: if (encoder) { diff --git a/src/video/n3ds/SDL_n3dsvideo.c b/src/video/n3ds/SDL_n3dsvideo.c index 77b1b690fe..0fdbbc294b 100644 --- a/src/video/n3ds/SDL_n3dsvideo.c +++ b/src/video/n3ds/SDL_n3dsvideo.c @@ -102,8 +102,7 @@ static int N3DS_VideoInit(_THIS) return 0; } -SDL_FORCE_INLINE void -AddN3DSDisplay(gfxScreen_t screen) +static void AddN3DSDisplay(gfxScreen_t screen) { SDL_DisplayMode mode; SDL_VideoDisplay display; diff --git a/src/video/ngage/SDL_ngagevideo.cpp b/src/video/ngage/SDL_ngagevideo.cpp index a3c116488b..0fbe3d7089 100644 --- a/src/video/ngage/SDL_ngagevideo.cpp +++ b/src/video/ngage/SDL_ngagevideo.cpp @@ -152,7 +152,7 @@ int NGAGE_VideoInit(_THIS) mode.format = SDL_PIXELFORMAT_RGB444; mode.pixel_w = 176; mode.pixel_h = 208; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { + if (SDL_AddBasicVideoDisplay(&mode) == 0) { return -1; } diff --git a/src/video/offscreen/SDL_offscreenvideo.c b/src/video/offscreen/SDL_offscreenvideo.c index 6d4b015215..d3b8a54105 100644 --- a/src/video/offscreen/SDL_offscreenvideo.c +++ b/src/video/offscreen/SDL_offscreenvideo.c @@ -105,7 +105,7 @@ int OFFSCREEN_VideoInit(_THIS) mode.format = SDL_PIXELFORMAT_RGB888; mode.pixel_w = 1024; mode.pixel_h = 768; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { + if (SDL_AddBasicVideoDisplay(&mode) == 0) { return -1; } diff --git a/src/video/psp/SDL_pspvideo.c b/src/video/psp/SDL_pspvideo.c index 109fda456e..8d0fc17e4a 100644 --- a/src/video/psp/SDL_pspvideo.c +++ b/src/video/psp/SDL_pspvideo.c @@ -154,9 +154,10 @@ int PSP_VideoInit(_THIS) mode.format = SDL_PIXELFORMAT_BGR565; SDL_AddDisplayMode(&display, &mode); - SDL_AddVideoDisplay(&display, SDL_FALSE); - - return 1; + if (SDL_AddVideoDisplay(&display, SDL_FALSE) == 0) { + return -1; + } + return 0; } void PSP_VideoQuit(_THIS) diff --git a/src/video/riscos/SDL_riscosmodes.c b/src/video/riscos/SDL_riscosmodes.c index 4b2b7e2422..f834d60e87 100644 --- a/src/video/riscos/SDL_riscosmodes.c +++ b/src/video/riscos/SDL_riscosmodes.c @@ -224,7 +224,10 @@ int RISCOS_InitModes(_THIS) return SDL_OutOfMemory(); } - return SDL_AddBasicVideoDisplay(&mode); + if (SDL_AddBasicVideoDisplay(&mode) == 0) { + return -1; + } + return 0; } void RISCOS_GetDisplayModes(_THIS, SDL_VideoDisplay *display) diff --git a/src/video/uikit/SDL_uikitmodes.m b/src/video/uikit/SDL_uikitmodes.m index a9761b24b1..6d8be3029a 100644 --- a/src/video/uikit/SDL_uikitmodes.m +++ b/src/video/uikit/SDL_uikitmodes.m @@ -359,8 +359,9 @@ int UIKit_AddDisplay(UIScreen *uiscreen, SDL_bool send_event) } display.driverdata = data; - SDL_AddVideoDisplay(&display, send_event); - + if (SDL_AddVideoDisplay(&display, send_event) == 0) { + return -1; + } return 0; } diff --git a/src/video/vivante/SDL_vivantevideo.c b/src/video/vivante/SDL_vivantevideo.c index 31590ce485..4cf6000363 100644 --- a/src/video/vivante/SDL_vivantevideo.c +++ b/src/video/vivante/SDL_vivantevideo.c @@ -161,7 +161,9 @@ static int VIVANTE_AddVideoDisplays(_THIS) display.desktop_mode = mode; display.current_mode = mode; display.driverdata = data; - SDL_AddVideoDisplay(&display, SDL_FALSE); + if (SDL_AddVideoDisplay(&display, SDL_FALSE) == 0) { + return -1; + } return 0; } diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c index 932569ee73..5002462577 100644 --- a/src/video/wayland/SDL_waylandvideo.c +++ b/src/video/wayland/SDL_waylandvideo.c @@ -1021,7 +1021,7 @@ static void Wayland_VideoCleanup(_THIS) display->display_modes[j].driverdata = NULL; } display->desktop_mode.driverdata = NULL; - SDL_DelVideoDisplay(i); + SDL_DelVideoDisplay(display->id); } data->output_list = NULL; diff --git a/src/video/windows/SDL_windowsmodes.c b/src/video/windows/SDL_windowsmodes.c index ad8d51c34a..e52c6dbc39 100644 --- a/src/video/windows/SDL_windowsmodes.c +++ b/src/video/windows/SDL_windowsmodes.c @@ -855,9 +855,10 @@ void WIN_RefreshDisplays(_THIS) // Delete any entries still marked as invalid, iterate // in reverse as each delete takes effect immediately for (i = _this->num_displays - 1; i >= 0; --i) { - SDL_DisplayData *driverdata = _this->displays[i].driverdata; + SDL_VideoDisplay *display = &_this->displays[i]; + SDL_DisplayData *driverdata = display->driverdata; if (driverdata->IsValid == SDL_FALSE) { - SDL_DelVideoDisplay(i); + SDL_DelVideoDisplay(display->id); } } } diff --git a/src/video/winrt/SDL_winrtvideo.cpp b/src/video/winrt/SDL_winrtvideo.cpp index 3d6216ab63..d74fd1b4cc 100644 --- a/src/video/winrt/SDL_winrtvideo.cpp +++ b/src/video/winrt/SDL_winrtvideo.cpp @@ -347,7 +347,7 @@ static int WINRT_AddDisplaysForOutput(_THIS, IDXGIAdapter1 *dxgiAdapter1, int ou } } - if (SDL_AddVideoDisplay(&display, SDL_FALSE) < 0) { + if (SDL_AddVideoDisplay(&display, SDL_FALSE) == 0) { goto done; } @@ -434,7 +434,7 @@ static int WINRT_AddDisplaysForAdapter(_THIS, IDXGIFactory2 *dxgiFactory2, int a display.desktop_mode = mode; display.current_mode = mode; bool error = SDL_AddDisplayMode(&display, &mode) < 0 || - SDL_AddVideoDisplay(&display, SDL_FALSE) < 0; + SDL_AddVideoDisplay(&display, SDL_FALSE) == 0; if (display.name) { SDL_free(display.name); } diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c index 5cf0801e3e..c6ea009311 100644 --- a/src/video/x11/SDL_x11modes.c +++ b/src/video/x11/SDL_x11modes.c @@ -388,7 +388,10 @@ static int X11_AddXRandRDisplay(_THIS, Display *dpy, int screen, RROutput output display.desktop_mode = mode; display.current_mode = mode; display.driverdata = displaydata; - return SDL_AddVideoDisplay(&display, send_event); + if (SDL_AddVideoDisplay(&display, send_event) == 0) { + return -1; + } + return 0; } static void X11_HandleXRandROutputChange(_THIS, const XRROutputChangeNotifyEvent *ev) @@ -628,8 +631,9 @@ static int X11_InitModes_StdXlib(_THIS) display.desktop_mode = mode; display.current_mode = mode; display.driverdata = displaydata; - SDL_AddVideoDisplay(&display, SDL_TRUE); - + if (SDL_AddVideoDisplay(&display, SDL_TRUE) == 0) { + return -1; + } return 0; }