If we fail to demarshal a closure we need to close any fds we've already removed from the buffer. The rest will be cleaned up when client_destroy results in a connection_flush.
Signed-off-by: Derek Foreman <der...@osg.samsung.com> --- src/connection.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/connection.c b/src/connection.c index 22bf836..934fddf 100644 --- a/src/connection.c +++ b/src/connection.c @@ -631,6 +631,8 @@ wl_connection_demarshal(struct wl_connection *connection, { uint32_t *p, *next, *end, length, id; int fd; + int fds[WL_CLOSURE_MAX_ARGS]; + unsigned int fd_count = 0; char *s; unsigned int i, count, num_arrays; const char *signature; @@ -781,6 +783,7 @@ wl_connection_demarshal(struct wl_connection *connection, wl_buffer_copy(&connection->fds_in, &fd, sizeof fd); connection->fds_in.tail += sizeof fd; closure->args[i].h = fd; + fds[fd_count++] = fd; break; default: wl_abort("unknown type\n"); @@ -796,6 +799,8 @@ wl_connection_demarshal(struct wl_connection *connection, return closure; err: + for (i = 0; i < fd_count; i++) + close(fds[i]); wl_closure_destroy(closure); wl_connection_consume(connection, size); -- 2.11.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel