aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_gtk_primary_selection.h1
-rw-r--r--types/wlr_gtk_primary_selection.c10
2 files changed, 10 insertions, 1 deletions
diff --git a/include/wlr/types/wlr_gtk_primary_selection.h b/include/wlr/types/wlr_gtk_primary_selection.h
index 7cf34201..436a50d2 100644
--- a/include/wlr/types/wlr_gtk_primary_selection.h
+++ b/include/wlr/types/wlr_gtk_primary_selection.h
@@ -36,6 +36,7 @@ struct wlr_gtk_primary_selection_device {
struct wl_list resources; // wl_resource_get_link
struct wl_list offers; // wl_resource_get_link
+ uint32_t selection_serial;
struct wl_listener seat_destroy;
struct wl_listener seat_focus_change;
diff --git a/types/wlr_gtk_primary_selection.c b/types/wlr_gtk_primary_selection.c
index 5f349154..ca82b3e7 100644
--- a/types/wlr_gtk_primary_selection.c
+++ b/types/wlr_gtk_primary_selection.c
@@ -1,5 +1,6 @@
#define _POSIX_C_SOURCE 200809L
#include <assert.h>
+#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -202,7 +203,14 @@ static void device_handle_set_selection(struct wl_client *client,
source = &client_source->source;
}
- // TODO: serial checking
+ // TODO: improve serial validation
+ if (device->seat->primary_selection_source != NULL &&
+ device->selection_serial - serial < UINT32_MAX / 2) {
+ wlr_log(WLR_DEBUG, "Rejecting set_selection request, invalid serial "
+ "(%"PRIu32" <= %"PRIu32")", serial, device->selection_serial);
+ return;
+ }
+ device->selection_serial = serial;
wlr_seat_set_primary_selection(device->seat, source);
}