From 5f682e77cb87d0e7494849eb3b517252a87b4ed4 Mon Sep 17 00:00:00 2001
From: Guldoman <[EMAIL REDACTED]>
Date: Wed, 10 Aug 2022 20:01:15 +0200
Subject: [PATCH] wayland: Remove freed display from
`SDL_WaylandOutputData->output_list`
---
src/video/wayland/SDL_waylandvideo.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index 75bd80718dd..267812417c1 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -736,7 +736,7 @@ Wayland_add_display(SDL_VideoData *d, uint32_t id)
}
static void
-Wayland_free_display(uint32_t id)
+Wayland_free_display(SDL_VideoData *d, uint32_t id)
{
int num_displays = SDL_GetNumVideoDisplays();
SDL_VideoDisplay *display;
@@ -747,6 +747,19 @@ Wayland_free_display(uint32_t id)
display = SDL_GetDisplay(i);
data = (SDL_WaylandOutputData *) display->driverdata;
if (data->registry_id == id) {
+ if (d->output_list != NULL) {
+ SDL_WaylandOutputData *node = d->output_list;
+ if (node == data) {
+ d->output_list = node->next;
+ } else {
+ while (node->next != data && node->next != NULL) {
+ node = node->next;
+ }
+ if (node->next != NULL) {
+ node->next = node->next->next;
+ }
+ }
+ }
SDL_DelVideoDisplay(i);
if (data->xdg_output) {
zxdg_output_v1_destroy(data->xdg_output);
@@ -886,8 +899,9 @@ display_handle_global(void *data, struct wl_registry *registry, uint32_t id,
static void
display_remove_global(void *data, struct wl_registry *registry, uint32_t id)
{
+ SDL_VideoData *d = data;
/* We don't get an interface, just an ID, so assume it's a wl_output :shrug: */
- Wayland_free_display(id);
+ Wayland_free_display(d, id);
}
static const struct wl_registry_listener registry_listener = {