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

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@hardening-consulting.com>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Sam Spilsbury <smspillaz@gmail.com>
diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c
index 49d9f10..d74dd5e 100644
--- a/src/compositor-rdp.c
+++ b/src/compositor-rdp.c
@@ -109,7 +109,7 @@
 struct rdp_peers_item {
 	int flags;
 	freerdp_peer *peer;
-	struct weston_seat seat;
+	struct weston_seat *seat;
 
 	struct wl_list link;
 };
@@ -640,9 +640,10 @@
 	}
 
 	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);
+		/* XXX we should weston_seat_release(context->item.seat); here
+		 * but it would crash on reconnect */
 	}
 
 	Stream_Free(context->encode_stream, TRUE);
@@ -911,9 +912,16 @@
 	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 +960,7 @@
 	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 +974,7 @@
 		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 +999,13 @@
 		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 +1018,7 @@
 
 	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 +1081,7 @@
 
 		/*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);
 	}