[PATCH] server: Fix shm_create_pool size fail path fd leak

Sergi Granell xerpi.g.12 at gmail.com
Thu Feb 18 22:59:29 UTC 2016


If the client passed a size <= 0 to shm_create_pool, it would
go to err_free, which wouldn't close the fd, and thus leave it opened.

We can also move the size check before the struct wl_shm_pool
malloc, so in case the client passes a wrong size, it won't
do an unnecessary malloc and then free.
---
 src/wayland-shm.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/wayland-shm.c b/src/wayland-shm.c
index a4343a4..81bf657 100644
--- a/src/wayland-shm.c
+++ b/src/wayland-shm.c
@@ -230,17 +230,17 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource,
 {
 	struct wl_shm_pool *pool;
 
-	pool = malloc(sizeof *pool);
-	if (pool == NULL) {
-		wl_client_post_no_memory(client);
-		goto err_close;
-	}
-
 	if (size <= 0) {
 		wl_resource_post_error(resource,
 				       WL_SHM_ERROR_INVALID_STRIDE,
 				       "invalid size (%d)", size);
-		goto err_free;
+		goto err_close;
+	}
+
+	pool = malloc(sizeof *pool);
+	if (pool == NULL) {
+		wl_client_post_no_memory(client);
+		goto err_close;
 	}
 
 	pool->refcount = 1;
@@ -251,7 +251,7 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource,
 		wl_resource_post_error(resource,
 				       WL_SHM_ERROR_INVALID_FD,
 				       "failed mmap fd %d", fd);
-		goto err_close;
+		goto err_free;
 	}
 	close(fd);
 
@@ -270,10 +270,10 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource,
 
 	return;
 
-err_close:
-	close(fd);
 err_free:
 	free(pool);
+err_close:
+	close(fd);
 }
 
 static const struct wl_shm_interface shm_interface = {
-- 
2.7.1



More information about the wayland-devel mailing list