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 <[email protected]> --- 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..2a7e29b 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 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_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 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
