SDL: wayland: A bunch of clipboard safety fixes.

From 875f839df4fe52485209d948be4940ee16e36c66 Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Thu, 8 Apr 2021 14:14:46 -0400
Subject: [PATCH] wayland: A bunch of clipboard safety fixes.

Also removed Wayland_get_data_device because it was a pointless getter function.
---
 src/video/wayland/SDL_waylandclipboard.c | 70 +++++++++++++-----------
 src/video/wayland/SDL_waylandevents.c    |  9 ---
 src/video/wayland/SDL_waylandevents_c.h  |  2 -
 3 files changed, 37 insertions(+), 44 deletions(-)

diff --git a/src/video/wayland/SDL_waylandclipboard.c b/src/video/wayland/SDL_waylandclipboard.c
index 551f6036d..30c89fdf3 100644
--- a/src/video/wayland/SDL_waylandclipboard.c
+++ b/src/video/wayland/SDL_waylandclipboard.c
@@ -37,19 +37,20 @@ Wayland_SetClipboardText(_THIS, const char *text)
         status = SDL_SetError("Video driver uninitialized");
     } else {
         video_data = _this->driverdata;
-        /* TODO: Support more than one seat */ 
-        data_device = Wayland_get_data_device(video_data->input);
-        if (text[0] != '\0') {
-            SDL_WaylandDataSource* source = Wayland_data_source_create(_this);
-            Wayland_data_source_add_data(source, TEXT_MIME, text,
-                                         strlen(text) + 1); 
-
-            status = Wayland_data_device_set_selection(data_device, source);
-            if (status != 0) {
-                Wayland_data_source_destroy(source);
+        if (video_data->input != NULL && video_data->input->data_device != NULL) {
+            data_device = video_data->input->data_device;
+            if (text[0] != '\0') {
+                SDL_WaylandDataSource* source = Wayland_data_source_create(_this);
+                Wayland_data_source_add_data(source, TEXT_MIME, text,
+                                             strlen(text) + 1);
+
+                status = Wayland_data_device_set_selection(data_device, source);
+                if (status != 0) {
+                    Wayland_data_source_destroy(source);
+                }
+            } else {
+                status = Wayland_data_device_clear_selection(data_device);
             }
-        } else {
-            status = Wayland_data_device_clear_selection(data_device);
         }
     }
 
@@ -71,20 +72,21 @@ Wayland_GetClipboardText(_THIS)
         SDL_SetError("Video driver uninitialized");
     } else {
         video_data = _this->driverdata;
-        /* TODO: Support more than one seat */ 
-        data_device = Wayland_get_data_device(video_data->input);
-        if (data_device->selection_offer != NULL) {
-            buffer = Wayland_data_offer_receive(data_device->selection_offer,
-                                                &length, TEXT_MIME, SDL_TRUE);
-            if (length > 0) {
-                text = (char*) buffer;
-            } 
-        } else if (data_device->selection_source != NULL) {
-            buffer = Wayland_data_source_get_data(data_device->selection_source,
-                                                  &length, TEXT_MIME, SDL_TRUE);
-            if (length > 0) {
-                text = (char*) buffer;
-            } 
+        if (video_data->input != NULL && video_data->input->data_device != NULL) {
+            data_device = video_data->input->data_device;
+            if (data_device->selection_offer != NULL) {
+                buffer = Wayland_data_offer_receive(data_device->selection_offer,
+                                                    &length, TEXT_MIME, SDL_TRUE);
+                if (length > 0) {
+                    text = (char*) buffer;
+                }
+            } else if (data_device->selection_source != NULL) {
+                buffer = Wayland_data_source_get_data(data_device->selection_source,
+                                                      &length, TEXT_MIME, SDL_TRUE);
+                if (length > 0) {
+                    text = (char*) buffer;
+                }
+            }
         }
     }
 
@@ -106,13 +108,15 @@ Wayland_HasClipboardText(_THIS)
         SDL_SetError("Video driver uninitialized");
     } else {
         video_data = _this->driverdata;
-        data_device = Wayland_get_data_device(video_data->input);
-        if (data_device != NULL && Wayland_data_offer_has_mime(
-                data_device->selection_offer, TEXT_MIME)) {
-            result = SDL_TRUE;
-        } else if(data_device != NULL && Wayland_data_source_has_mime(
-                data_device->selection_source, TEXT_MIME)) {
-            result = SDL_TRUE;
+        if (video_data->input != NULL && video_data->input->data_device != NULL) {
+            data_device = video_data->input->data_device;
+            if (Wayland_data_offer_has_mime(
+                    data_device->selection_offer, TEXT_MIME)) {
+                result = SDL_TRUE;
+            } else if (Wayland_data_source_has_mime(
+                    data_device->selection_source, TEXT_MIME)) {
+                result = SDL_TRUE;
+            }
         }
     }
     return result;
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index 08c1866ab..ef4f2ccca 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -1192,15 +1192,6 @@ void Wayland_display_destroy_input(SDL_VideoData *d)
     d->input = NULL;
 }
 
-SDL_WaylandDataDevice* Wayland_get_data_device(struct SDL_WaylandInput *input)
-{
-    if (input == NULL) {
-        return NULL;
-    }
-
-    return input->data_device;
-}
-
 /* !!! FIXME: just merge these into display_handle_global(). */
 void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id)
 {
diff --git a/src/video/wayland/SDL_waylandevents_c.h b/src/video/wayland/SDL_waylandevents_c.h
index 720608b12..ac4fcceb3 100644
--- a/src/video/wayland/SDL_waylandevents_c.h
+++ b/src/video/wayland/SDL_waylandevents_c.h
@@ -85,8 +85,6 @@ extern void Wayland_add_data_device_manager(SDL_VideoData *d, uint32_t id, uint3
 extern void Wayland_display_add_input(SDL_VideoData *d, uint32_t id, uint32_t version);
 extern void Wayland_display_destroy_input(SDL_VideoData *d);
 
-extern SDL_WaylandDataDevice* Wayland_get_data_device(struct SDL_WaylandInput *input);
-
 extern void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id);
 extern void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d);