From b481eff34cd2d94831c79e30484d24feb1c8bac6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 10 Feb 2023 16:04:24 +1000 Subject: [PATCH] eis: only allow the available caps to bind to a seat A client binding with caps >= the seat's current version will get disconnected now. --- src/libeis-seat.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/libeis-seat.c b/src/libeis-seat.c index 2340084..c7872ee 100644 --- a/src/libeis-seat.c +++ b/src/libeis-seat.c @@ -90,6 +90,20 @@ client_msg_release(struct eis_seat *seat) static int client_msg_bind(struct eis_seat *seat, uint32_t caps) { + uint32_t allowed_caps = 0; + + if (seat->proto_object.version >= EIS_SEAT_CAPABILITIES_POINTER_SINCE_VERSION) + allowed_caps |= EIS_SEAT_CAPABILITIES_POINTER; + if (seat->proto_object.version >= EIS_SEAT_CAPABILITIES_POINTER_ABSOLUTE_SINCE_VERSION) + allowed_caps |= EIS_SEAT_CAPABILITIES_POINTER_ABSOLUTE; + if (seat->proto_object.version >= EIS_SEAT_CAPABILITIES_KEYBOARD_SINCE_VERSION) + allowed_caps |= EIS_SEAT_CAPABILITIES_KEYBOARD; + if (seat->proto_object.version >= EIS_SEAT_CAPABILITIES_TOUCHSCREEN_SINCE_VERSION) + allowed_caps |= EIS_SEAT_CAPABILITIES_TOUCHSCREEN; + + if (caps & ~allowed_caps) + return -EINVAL; + eis_seat_bind(seat, caps); return 0;