SDL: wayland: Release the SHM pool after initial cursor buffer creation

From b3060956c35cb1f49b43b604bf1ab9335135f98f Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Fri, 7 Nov 2025 12:57:43 -0500
Subject: [PATCH] wayland: Release the SHM pool after initial cursor buffer
 creation

The backing memory will be automatically unmapped when the buffer objects are destroyed, so no need to keep the pool around.
---
 src/video/wayland/SDL_waylandmouse.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/video/wayland/SDL_waylandmouse.c b/src/video/wayland/SDL_waylandmouse.c
index a6759f6c3b579..6de3f93584821 100644
--- a/src/video/wayland/SDL_waylandmouse.c
+++ b/src/video/wayland/SDL_waylandmouse.c
@@ -65,7 +65,6 @@ typedef struct
     int hot_x;
     int hot_y;
 
-    Wayland_SHMPool *shmPool;
     int images_per_frame;
     CustomCursorImage images[];
 } Wayland_CustomCursor;
@@ -736,6 +735,7 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
     }
 
     SDL_CursorData *data = NULL;
+    Wayland_SHMPool *shm_pool = NULL;
     int pool_size = 0;
     int max_images = 0;
     bool is_stack = false;
@@ -773,8 +773,8 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
         goto failed;
     }
 
-    data->cursor_data.custom.shmPool = Wayland_AllocSHMPool(pool_size);
-    if (!data->cursor_data.custom.shmPool) {
+    shm_pool = Wayland_AllocSHMPool(pool_size);
+    if (!shm_pool) {
         goto failed;
     }
 
@@ -812,7 +812,7 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
             data->cursor_data.custom.images[offset + j].height = surface->h;
 
             void *buf_data;
-            data->cursor_data.custom.images[offset + j].buffer = Wayland_AllocBufferFromPool(data->cursor_data.custom.shmPool, surface->w, surface->h, &buf_data);
+            data->cursor_data.custom.images[offset + j].buffer = Wayland_AllocBufferFromPool(shm_pool, surface->w, surface->h, &buf_data);
             // Wayland requires premultiplied alpha for its surfaces.
             SDL_PremultiplyAlpha(surface->w, surface->h,
                                  surface->format, surface->pixels, surface->pitch,
@@ -828,12 +828,13 @@ static SDL_Cursor *Wayland_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, int
     }
 
     SDL_small_free(surfaces, is_stack);
+    Wayland_ReleaseSHMPool(shm_pool);
 
     return cursor;
 
 failed:
+    Wayland_ReleaseSHMPool(shm_pool);
     if (data) {
-        Wayland_ReleaseSHMPool(data->cursor_data.custom.shmPool);
         SDL_free(data->frame_durations_ms);
         for (int i = 0; i < data->cursor_data.custom.images_per_frame * frame_count; ++i) {
             if (data->cursor_data.custom.images[i].buffer) {
@@ -922,8 +923,6 @@ static void Wayland_FreeCursorData(SDL_CursorData *d)
                 wl_buffer_destroy(d->cursor_data.custom.images[i].buffer);
             }
         }
-
-        Wayland_ReleaseSHMPool(d->cursor_data.custom.shmPool);
     }
 
     SDL_free(d->frame_durations_ms);