Index: uspace/srv/hid/rfb/rfb.c
===================================================================
--- uspace/srv/hid/rfb/rfb.c	(revision 47b27b40836439054f5594614fa35fbd70a2c0bf)
+++ uspace/srv/hid/rfb/rfb.c	(revision 870f78cb5edbf47ff1c7b5d88fdcddd374690118)
@@ -301,5 +301,5 @@
 }
 
-static int rfb_send_palette(int conn_sd, rfb_t *rfb)
+static void *rfb_send_palette_message(rfb_t *rfb, size_t *psize)
 {
 	size_t size = sizeof(rfb_set_color_map_entries_t) +
@@ -308,5 +308,5 @@
 	void *buf = malloc(size);
 	if (buf == NULL)
-		return ENOMEM;
+		return NULL;
 	
 	void *pos = buf;
@@ -327,8 +327,6 @@
 	}
 	
-	int rc = send(conn_sd, buf, size, 0);
-	free(buf);
-	
-	return rc;
+	*psize = size;
+	return buf;
 }
 
@@ -481,4 +479,5 @@
 static int rfb_send_framebuffer_update(rfb_t *rfb, int conn_sd, bool incremental)
 {
+	fibril_mutex_lock(&rfb->lock);
 	if (!incremental || !rfb->damage_valid) {
 		rfb->damage_rect.x = 0;
@@ -496,6 +495,8 @@
 	
 	void *buf = malloc(buf_size);
-	if (buf == NULL)
+	if (buf == NULL) {
+		fibril_mutex_unlock(&rfb->lock);
 		return ENOMEM;
+	}
 	memset(buf, 0, buf_size);
 	
@@ -522,6 +523,22 @@
 	rfb_rectangle_to_be(rect, rect);
 	
+	rfb->damage_valid = false;
+	
+	size_t send_palette_size = 0;
+	void *send_palette = NULL;
+	
 	if (!rfb->pixel_format.true_color) {
-		int rc = rfb_send_palette(conn_sd, rfb);
+		send_palette = rfb_send_palette_message(rfb, &send_palette_size);
+		if (send_palette == NULL) {
+			free(buf);
+			fibril_mutex_unlock(&rfb->lock);
+			return ENOMEM;
+		}
+	}
+	
+	fibril_mutex_unlock(&rfb->lock);
+	
+	if (!rfb->pixel_format.true_color) {
+		int rc = send(conn_sd, send_palette, send_palette_size, 0);
 		if (rc != EOK) {
 			free(buf);
@@ -532,5 +549,5 @@
 	int rc = send(conn_sd, buf, buf_size, 0);
 	free(buf);
-	rfb->damage_valid = false;
+	
 	return rc;
 }
@@ -694,7 +711,5 @@
 			log_msg(LOG_DEFAULT, LVL_DEBUG2,
 			    "Received FramebufferUpdateRequest message");
-			fibril_mutex_lock(&rfb->lock);
 			rfb_send_framebuffer_update(rfb, conn_sd, fbur.incremental);
-			fibril_mutex_unlock(&rfb->lock);
 			break;
 		case RFB_CMSG_KEY_EVENT:
