[PATCH] rdp: don't release the seat until it is safe v2

David Fort rdp.effort at gmail.com
Fri May 20 09:33:10 UTC 2016


Releasing a seat is not safe, so let's just announce it without keyboard
and mouse until this is fixed. Without this patch we just can't reconnect on
the RDP compositor as it crashes.

v2: fixed the leak of the xkb_keymap

Signed-off-by: David Fort <contact at hardening-consulting.com>
---
 src/compositor-rdp.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c
index 4fc7c74..52cf426 100644
--- a/src/compositor-rdp.c
+++ b/src/compositor-rdp.c
@@ -109,7 +109,7 @@ enum peer_item_flags {
 struct rdp_peers_item {
 	int flags;
 	freerdp_peer *peer;
-	struct weston_seat seat;
+	struct weston_seat *seat;
 
 	struct wl_list link;
 };
@@ -640,9 +640,9 @@ rdp_peer_context_free(freerdp_peer* client, RdpPeerContext* context)
 	}
 
 	if (context->item.flags & RDP_PEER_ACTIVATED) {
-		weston_seat_release_keyboard(&context->item.seat);
-		weston_seat_release_pointer(&context->item.seat);
-		weston_seat_release(&context->item.seat);
+		weston_seat_release_keyboard(context->item.seat);
+		weston_seat_release_pointer(context->item.seat);
+		/*weston_seat_release(context->item.seat);*/
 	}
 
 	Stream_Free(context->encode_stream, TRUE);
@@ -911,9 +911,16 @@ xf_peer_activate(freerdp_peer* client)
 	else
 		snprintf(seat_name, sizeof(seat_name), "RDP peer @%s", settings->ClientAddress);
 
-	weston_seat_init(&peersItem->seat, b->compositor, seat_name);
-	weston_seat_init_keyboard(&peersItem->seat, keymap);
-	weston_seat_init_pointer(&peersItem->seat);
+	peersItem->seat = zalloc(sizeof(*peersItem->seat));
+	if (!peersItem->seat) {
+		xkb_keymap_unref(keymap);
+		weston_log("unable to create a weston_seat\n");
+		return FALSE;
+	}
+
+	weston_seat_init(peersItem->seat, b->compositor, seat_name);
+	weston_seat_init_keyboard(peersItem->seat, keymap);
+	weston_seat_init_pointer(peersItem->seat);
 
 	peersItem->flags |= RDP_PEER_ACTIVATED;
 
@@ -952,7 +959,7 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 	if (flags & PTR_FLAGS_MOVE) {
 		output = peerContext->rdpBackend->output;
 		if (x < output->base.width && y < output->base.height) {
-			notify_motion_absolute(&peerContext->item.seat, weston_compositor_get_time(),
+			notify_motion_absolute(peerContext->item.seat, weston_compositor_get_time(),
 					x, y);
 			need_frame = true;
 		}
@@ -966,7 +973,7 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 		button = BTN_MIDDLE;
 
 	if (button) {
-		notify_button(&peerContext->item.seat, weston_compositor_get_time(), button,
+		notify_button(peerContext->item.seat, weston_compositor_get_time(), button,
 			(flags & PTR_FLAGS_DOWN) ? WL_POINTER_BUTTON_STATE_PRESSED : WL_POINTER_BUTTON_STATE_RELEASED
 		);
 		need_frame = true;
@@ -991,13 +998,13 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 		weston_event.discrete = (int)value;
 		weston_event.has_discrete = true;
 
-		notify_axis(&peerContext->item.seat, weston_compositor_get_time(),
+		notify_axis(peerContext->item.seat, weston_compositor_get_time(),
 			    &weston_event);
 		need_frame = true;
 	}
 
 	if (need_frame)
-		notify_pointer_frame(&peerContext->item.seat);
+		notify_pointer_frame(peerContext->item.seat);
 
 	FREERDP_CB_RETURN(TRUE);
 }
@@ -1010,7 +1017,7 @@ xf_extendedMouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 
 	output = peerContext->rdpBackend->output;
 	if (x < output->base.width && y < output->base.height) {
-		notify_motion_absolute(&peerContext->item.seat, weston_compositor_get_time(),
+		notify_motion_absolute(peerContext->item.seat, weston_compositor_get_time(),
 				x, y);
 	}
 
@@ -1073,7 +1080,7 @@ xf_input_keyboard_event(rdpInput *input, UINT16 flags, UINT16 code)
 
 		/*weston_log("code=%x ext=%d vk_code=%x scan_code=%x\n", code, (flags & KBD_FLAGS_EXTENDED) ? 1 : 0,
 				vk_code, scan_code);*/
-		notify_key(&peerContext->item.seat, weston_compositor_get_time(),
+		notify_key(peerContext->item.seat, weston_compositor_get_time(),
 					scan_code - 8, keyState, STATE_UPDATE_AUTOMATIC);
 	}
 
-- 
2.7.4



More information about the wayland-devel mailing list