diff options
-rw-r--r-- | protocol/wayland.xml | 3 | ||||
-rw-r--r-- | src/wayland-shm.c | 10 |
2 files changed, 10 insertions, 3 deletions
diff --git a/protocol/wayland.xml b/protocol/wayland.xml index db1b349..330f8ab 100644 --- a/protocol/wayland.xml +++ b/protocol/wayland.xml @@ -246,7 +246,8 @@ <description summary="change the size of the pool mapping"> This request will cause the server to remap the backing memory for the pool from the file descriptor passed when the pool was - created, but using the new size. + created, but using the new size. This request can only be + used to make the pool bigger. </description> <arg name="size" type="int"/> diff --git a/src/wayland-shm.c b/src/wayland-shm.c index ee1c8e6..3fce678 100644 --- a/src/wayland-shm.c +++ b/src/wayland-shm.c @@ -50,7 +50,7 @@ struct wl_shm_pool { struct wl_resource *resource; int refcount; char *data; - int size; + int32_t size; }; struct wl_shm_buffer { @@ -195,8 +195,14 @@ shm_pool_resize(struct wl_client *client, struct wl_resource *resource, struct wl_shm_pool *pool = wl_resource_get_user_data(resource); void *data; - data = mremap(pool->data, pool->size, size, MREMAP_MAYMOVE); + if (size < pool->size) { + wl_resource_post_error(resource, + WL_SHM_ERROR_INVALID_FD, + "shrinking pool invalid"); + return; + } + data = mremap(pool->data, pool->size, size, MREMAP_MAYMOVE); if (data == MAP_FAILED) { wl_resource_post_error(resource, WL_SHM_ERROR_INVALID_FD, |