diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-12-09 10:44:50 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-09 10:44:50 -0500 |
commit | 25b150352ce4ffa851d5d6c28951e1f9dae7ff4a (patch) | |
tree | 6a615c141c938e8933231b27f558a112906192d4 | |
parent | 3699496256cd7a7c381dbc2cd6afe39cda9390dc (diff) | |
parent | c2113decb3adf1ba67e26df9d93a442128f6d57d (diff) |
Merge pull request #1429 from emersion/primary-serial-validation
gtk-primary-selection: basic serial validation
-rw-r--r-- | include/wlr/types/wlr_gtk_primary_selection.h | 1 | ||||
-rw-r--r-- | types/wlr_gtk_primary_selection.c | 15 |
2 files changed, 15 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..18bc624a 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> @@ -97,6 +98,7 @@ static void destroy_offer(struct wl_resource *resource) { struct client_data_source { struct wlr_primary_selection_source source; struct wl_resource *resource; + bool finalized; }; static void client_source_send( @@ -137,6 +139,9 @@ static void source_handle_offer(struct wl_client *client, if (source == NULL) { return; } + if (source->finalized) { + wlr_log(WLR_DEBUG, "Offering additional MIME type after set_selection"); + } char *dup_mime_type = strdup(mime_type); if (dup_mime_type == NULL) { @@ -199,10 +204,18 @@ static void device_handle_set_selection(struct wl_client *client, struct wlr_primary_selection_source *source = NULL; if (client_source != NULL) { + client_source->finalized = true; 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); } |