[PATCH v2 wayland 03/11] connection: Close fds from half demarshalled closures
Derek Foreman
derekf at osg.samsung.com
Thu Apr 13 16:51:45 UTC 2017
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 <derekf at 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
More information about the wayland-devel
mailing list