connection: close pending outgoing fds on shutdown

When destroying a wl_connection object, there might still be data in the
queue. We would leak open file-descriptors so we must close them.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-10-11 23:37:45 +02:00 committed by Kristian Høgsberg
parent c13a65fd20
commit cda89f3a42

View file

@ -167,9 +167,27 @@ wl_connection_create(int fd)
return connection; return connection;
} }
static void
close_fds(struct wl_buffer *buffer)
{
int fds[MAX_FDS_OUT], i, count;
size_t size;
size = buffer->head - buffer->tail;
if (size == 0)
return;
wl_buffer_copy(buffer, fds, size);
count = size / sizeof fds[0];
for (i = 0; i < count; i++)
close(fds[i]);
buffer->tail += size;
}
void void
wl_connection_destroy(struct wl_connection *connection) wl_connection_destroy(struct wl_connection *connection)
{ {
close_fds(&connection->fds_out);
close(connection->fd); close(connection->fd);
free(connection); free(connection);
} }
@ -205,23 +223,6 @@ build_cmsg(struct wl_buffer *buffer, char *data, int *clen)
} }
} }
static void
close_fds(struct wl_buffer *buffer)
{
int fds[MAX_FDS_OUT], i, count;
size_t size;
size = buffer->head - buffer->tail;
if (size == 0)
return;
wl_buffer_copy(buffer, fds, size);
count = size / sizeof fds[0];
for (i = 0; i < count; i++)
close(fds[i]);
buffer->tail += size;
}
static void static void
decode_cmsg(struct wl_buffer *buffer, struct msghdr *msg) decode_cmsg(struct wl_buffer *buffer, struct msghdr *msg)
{ {