SDL: Fixed checking the return values of SDL_AddBasicVideoDisplay() and SDL_AddVideoDisplay()

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;
 }