[PATCH 5/5] shm: Plug leak in shm_create_pool()
Martin Olsson
martin at minimum.se
Mon Jul 9 02:35:57 PDT 2012
---
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 62afc3b..7565623 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 = {
--
1.7.9.5
More information about the wayland-devel
mailing list