From ba76d37b0bed26ad32aec1b6bce4675ad2926246 Mon Sep 17 00:00:00 2001 From: Robin Ebert Date: Mon, 12 Jan 2026 12:40:34 +0100 Subject: [PATCH] wlr_ext_image_copy_capture_v1: Fix segmentation fault when using cursor session Fixes: 3b9f599cbe7aab8bf88ab0880f52dbaf25274665 --- types/wlr_ext_image_copy_capture_v1.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/types/wlr_ext_image_copy_capture_v1.c b/types/wlr_ext_image_copy_capture_v1.c index 72f25d5b5..c9e7b0079 100644 --- a/types/wlr_ext_image_copy_capture_v1.c +++ b/types/wlr_ext_image_copy_capture_v1.c @@ -14,6 +14,7 @@ struct wlr_ext_image_copy_capture_cursor_session_v1 { struct wl_resource *resource; struct wlr_ext_image_capture_source_v1_cursor *source; + struct wlr_ext_image_copy_capture_manager_v1 *manager; bool capture_session_created; struct { @@ -28,10 +29,18 @@ struct wlr_ext_image_copy_capture_cursor_session_v1 { struct wl_listener source_update; }; +static const struct ext_image_copy_capture_manager_v1_interface manager_impl; static const struct ext_image_copy_capture_frame_v1_interface frame_impl; static const struct ext_image_copy_capture_session_v1_interface session_impl; static const struct ext_image_copy_capture_cursor_session_v1_interface cursor_session_impl; +static struct wlr_ext_image_copy_capture_manager_v1 *manager_from_resource( + struct wl_resource *resource) { + assert(wl_resource_instance_of(resource, + &ext_image_copy_capture_manager_v1_interface, &manager_impl)); + return wl_resource_get_user_data(resource); +} + static struct wlr_ext_image_copy_capture_frame_v1 *frame_from_resource( struct wl_resource *resource) { assert(wl_resource_instance_of(resource, @@ -431,8 +440,7 @@ static void session_handle_resource_destroy(struct wl_resource *resource) { } static void session_create(struct wl_resource *parent_resource, uint32_t new_id, - struct wlr_ext_image_capture_source_v1 *source, uint32_t options) { - struct wlr_ext_image_copy_capture_manager_v1 *manager = wl_resource_get_user_data(parent_resource); + struct wlr_ext_image_capture_source_v1 *source, uint32_t options, struct wlr_ext_image_copy_capture_manager_v1 *manager) { struct wl_client *client = wl_resource_get_client(parent_resource); uint32_t version = wl_resource_get_version(parent_resource); struct wl_resource *session_resource = wl_resource_create(client, @@ -517,7 +525,7 @@ static void cursor_session_handle_get_capture_session(struct wl_client *client, source = &cursor_session->source->base; } - session_create(cursor_session_resource, new_id, source, 0); + session_create(cursor_session_resource, new_id, source, 0, cursor_session->manager); } static const struct ext_image_copy_capture_cursor_session_v1_interface cursor_session_impl = { @@ -580,7 +588,7 @@ static void manager_handle_create_session(struct wl_client *client, struct wl_resource *source_resource, uint32_t options) { struct wlr_ext_image_capture_source_v1 *source = wlr_ext_image_capture_source_v1_from_resource(source_resource); - session_create(manager_resource, new_id, source, options); + session_create(manager_resource, new_id, source, options, manager_from_resource(manager_resource)); } static void manager_handle_create_pointer_cursor_session(struct wl_client *client, @@ -621,6 +629,7 @@ static void manager_handle_create_pointer_cursor_session(struct wl_client *clien cursor_session->resource = cursor_session_resource; cursor_session->source = source_cursor; + cursor_session->manager = manager_from_resource(manager_resource); cursor_session->source_destroy.notify = cursor_session_handle_source_destroy; wl_signal_add(&source_cursor->base.events.destroy, &cursor_session->source_destroy);