[PATCH] wayland-server: Fix up error handling with client creation.
John Kåre Alsaker
john.kare.alsaker at gmail.com
Tue Oct 16 11:32:19 PDT 2012
---
src/wayland-server.c | 41 ++++++++++++++++++++++++++---------------
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/src/wayland-server.c b/src/wayland-server.c
index 41560f2..acbab9a 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -341,33 +341,41 @@ wl_client_create(struct wl_display *display, int fd)
WL_EVENT_READABLE,
wl_client_connection_data, client);
+ if (!client->source)
+ goto err_client;
+
len = sizeof client->ucred;
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED,
- &client->ucred, &len) < 0) {
- free(client);
- return NULL;
- }
+ &client->ucred, &len) < 0)
+ goto err_source;
client->connection = wl_connection_create(fd);
- if (client->connection == NULL) {
- free(client);
- return NULL;
- }
+ if (client->connection == NULL)
+ goto err_source;
wl_map_init(&client->objects);
- if (wl_map_insert_at(&client->objects, 0, NULL) < 0) {
- wl_map_release(&client->objects);
- free(client);
- return NULL;
- }
+ if (wl_map_insert_at(&client->objects, 0, NULL) < 0)
+ goto err_map;
wl_signal_init(&client->destroy_signal);
bind_display(client, display, 1, 1);
+ if (!client->display_resource)
+ goto err_map;
+
wl_list_insert(display->client_list.prev, &client->link);
return client;
+
+err_map:
+ wl_map_release(&client->objects);
+ wl_connection_destroy(client->connection);
+err_source:
+ wl_event_source_remove(client->source);
+err_client:
+ free(client);
+ return NULL;
}
WL_EXPORT void
@@ -1058,7 +1066,9 @@ bind_display(struct wl_client *client,
client->display_resource =
wl_client_add_object(client, &wl_display_interface,
&display_interface, id, display);
- client->display_resource->destroy = destroy_client_display_resource;
+
+ if(client->display_resource)
+ client->display_resource->destroy = destroy_client_display_resource;
}
WL_EXPORT struct wl_display *
@@ -1230,7 +1240,8 @@ socket_data(int fd, uint32_t mask, void *data)
if (client_fd < 0)
wl_log("failed to accept: %m\n");
else
- wl_client_create(display, client_fd);
+ if (!wl_client_create(display, client_fd))
+ close(client_fd);
return 1;
}
--
1.7.12.3
More information about the wayland-devel
mailing list