client, server: handle wl_map_insert_new() failures
authorAleksandr Mezin <mezin.alexander@gmail.com>
Wed, 9 Feb 2022 00:26:18 +0000 (06:26 +0600)
committerSimon Ser <contact@emersion.fr>
Fri, 25 Mar 2022 09:43:53 +0000 (09:43 +0000)
Signed-off-by: Aleksandr Mezin <mezin.alexander@gmail.com>
src/wayland-client.c
src/wayland-server.c

index a9fb01e..75692e6 100644 (file)
@@ -430,6 +430,10 @@ proxy_create(struct wl_proxy *factory, const struct wl_interface *interface,
        proxy->version = version;
 
        proxy->object.id = wl_map_insert_new(&display->objects, 0, proxy);
+       if (proxy->object.id == 0) {
+               free(proxy);
+               return NULL;
+       }
 
        return proxy;
 }
@@ -1158,11 +1162,16 @@ wl_display_connect_to_fd(int fd)
        pthread_cond_init(&display->reader_cond, NULL);
        display->reader_count = 0;
 
-       wl_map_insert_new(&display->objects, 0, NULL);
+       if (wl_map_insert_at(&display->objects, 0, 0, NULL) == -1)
+               goto err_connection;
 
-       display->proxy.object.interface = &wl_display_interface;
        display->proxy.object.id =
                wl_map_insert_new(&display->objects, 0, display);
+
+       if (display->proxy.object.id == 0)
+               goto err_connection;
+
+       display->proxy.object.interface = &wl_display_interface;
        display->proxy.display = display;
        display->proxy.object.implementation = (void(**)(void)) &display_listener;
        display->proxy.user_data = display;
index 9fc337b..a503452 100644 (file)
@@ -1826,8 +1826,13 @@ wl_resource_create(struct wl_client *client,
        if (resource == NULL)
                return NULL;
 
-       if (id == 0)
+       if (id == 0) {
                id = wl_map_insert_new(&client->objects, 0, NULL);
+               if (id == 0) {
+                       free(resource);
+                       return NULL;
+               }
+       }
 
        resource->object.id = id;
        resource->object.interface = interface;
@@ -2240,6 +2245,8 @@ wl_client_add_resource(struct wl_client *client,
                resource->object.id =
                        wl_map_insert_new(&client->objects,
                                          WL_MAP_ENTRY_LEGACY, resource);
+               if (resource->object.id == 0)
+                       return 0;
        } else if (wl_map_insert_at(&client->objects, WL_MAP_ENTRY_LEGACY,
                                  resource->object.id, resource) < 0) {
                if (errno == EINVAL) {