connection: close pending outgoing fds on shutdown
authorDavid Herrmann <dh.herrmann@googlemail.com>
Thu, 11 Oct 2012 21:37:45 +0000 (23:37 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 15 Oct 2012 20:12:46 +0000 (16:12 -0400)
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>
src/connection.c

index 8497670..0df416a 100644 (file)
@@ -167,9 +167,27 @@ wl_connection_create(int fd)
        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
 wl_connection_destroy(struct wl_connection *connection)
 {
+       close_fds(&connection->fds_out);
        close(connection->fd);
        free(connection);
 }
@@ -206,23 +224,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
 decode_cmsg(struct wl_buffer *buffer, struct msghdr *msg)
 {
        struct cmsghdr *cmsg;