From b07f8e987b62dbdad9be4e275579cf0b58ca8be9 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 7f33b9c7ab54..bc3be65a5027 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 f61c422546c8..368483d92ecd 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 ae085f74de11..442e7c8cabf7 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 77b1b690fea2..0fdbbc294b81 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 a3c116488b39..0fbe3d708988 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 6d4b015215be..d3b8a54105f1 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 109fda456e00..8d0fc17e4a15 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 4b2b7e242287..f834d60e8726 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 a9761b24b129..6d8be3029ad4 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 31590ce485aa..4cf60003637f 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 932569ee7327..500246257781 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 ad8d51c34a8c..e52c6dbc3955 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 3d6216ab636f..d74fd1b4ccd1 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 5cf0801e3e19..c6ea00931128 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;
}