From c94c0946db694ec29b5aebb94a8be0501bacfbc7 Mon Sep 17 00:00:00 2001 From: Martin Olsson Date: Mon, 9 Jul 2012 11:35:57 +0200 Subject: [PATCH] shm: Plug leak in shm_create_pool() --- src/wayland-shm.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/wayland-shm.c b/src/wayland-shm.c index 62afc3b9..75656233 100644 --- a/src/wayland-shm.c +++ b/src/wayland-shm.c @@ -188,29 +188,27 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource, pool = malloc(sizeof *pool); if (pool == NULL) { wl_resource_post_no_memory(resource); - close(fd); - return; + goto err_close; } if (size <= 0) { wl_resource_post_error(resource, WL_SHM_ERROR_INVALID_STRIDE, "invalid size (%d)", size); - close(fd); - return; + goto err_free; } pool->refcount = 1; pool->size = size; pool->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - close(fd); if (pool->data == MAP_FAILED) { wl_resource_post_error(resource, WL_SHM_ERROR_INVALID_FD, "failed mmap fd %d", fd); - return; + goto err_free; } + close(fd); pool->resource.object.id = id; pool->resource.object.interface = &wl_shm_pool_interface; @@ -222,6 +220,11 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource, pool->resource.destroy = destroy_pool; wl_client_add_resource(client, &pool->resource); + +err_close: + close(fd); +err_free: + free(pool); } static const struct wl_shm_interface shm_interface = {