[PATCH] server: Calculate remainig data size after a closure is processed

Jaeyoon Jung jaeyoon.jung at lge.com
Mon Jan 11 01:32:47 PST 2016


While processing a closure, data in the connection can be consumed again
if the closure itself invokes extra event dispatch. In that case the
remaining data size is also altered as a result. So we should update len
variable with the correct value after the closure is processed.

Signed-off-by: Jaeyoon Jung <jaeyoon.jung at lge.com>
---
 src/connection.c      | 8 +++++++-
 src/wayland-private.h | 3 +++
 src/wayland-server.c  | 3 ++-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/connection.c b/src/connection.c
index 6742f19..3c8f727 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -314,6 +314,12 @@ wl_connection_flush(struct wl_connection *connection)
 	return connection->out.head - tail;
 }
 
+uint32_t
+wl_connection_size(struct wl_connection *connection)
+{
+	return connection->in.head - connection->in.tail;
+}
+
 int
 wl_connection_read(struct wl_connection *connection)
 {
@@ -350,7 +356,7 @@ wl_connection_read(struct wl_connection *connection)
 
 	connection->in.head += len;
 
-	return connection->in.head - connection->in.tail;
+	return wl_connection_size(connection);
 }
 
 int
diff --git a/src/wayland-private.h b/src/wayland-private.h
index 58ac952..98b46ab 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -121,6 +121,9 @@ wl_connection_consume(struct wl_connection *connection, size_t size);
 int
 wl_connection_flush(struct wl_connection *connection);
 
+uint32_t
+wl_connection_size(struct wl_connection *connection);
+
 int
 wl_connection_read(struct wl_connection *connection);
 
diff --git a/src/wayland-server.c b/src/wayland-server.c
index 55c0cf9..1488c56 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -313,7 +313,6 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
 
 		closure = wl_connection_demarshal(client->connection, size,
 						  &client->objects, message);
-		len -= size;
 
 		if (closure == NULL && errno == ENOMEM) {
 			wl_resource_post_no_memory(resource);
@@ -346,6 +345,8 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
 
 		if (client->error)
 			break;
+
+		len = wl_connection_size(connection);
 	}
 
 	if (client->error)
-- 
2.6.4



More information about the wayland-devel mailing list