From 0a37511ecc0117339e5e5d0add84a2f3b51493d2 Mon Sep 17 00:00:00 2001 From: Jaeyoon Jung Date: Tue, 12 Jan 2016 13:12:34 +0900 Subject: [PATCH] server: Calculate remaining data size after a closure is processed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When 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, so the variable len should be updated after the closure is processed. Signed-off-by: Jaeyoon Jung Reviewed-by: Jonas Ã…dahl Reviewed-by: Derek Foreman --- 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 45a2e784..bc373f6b 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_pending_input(struct wl_connection *connection) +{ + return wl_buffer_size(&connection->in); +} + 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_pending_input(connection); } int diff --git a/src/wayland-private.h b/src/wayland-private.h index 0e3420c3..da578d16 100644 --- a/src/wayland-private.h +++ b/src/wayland-private.h @@ -122,6 +122,9 @@ wl_connection_consume(struct wl_connection *connection, size_t size); int wl_connection_flush(struct wl_connection *connection); +uint32_t +wl_connection_pending_input(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 9e26b185..2158c088 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_pending_input(connection); } if (client->error)