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