diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2014-04-07 14:42:20 -0700 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2014-04-07 16:01:25 -0700 |
commit | 24cdbe3d69763708dcd156edfbe7aa8d00bab860 (patch) | |
tree | 9907971c2697b7907152ac1d2bf1c374f294d88e | |
parent | c1aa1291a10eb63b41df27ecc53569e194f128d1 (diff) |
shm: Disallow shrinking shm pools
Unused shm space will be automatically reclaimed if unused or can be
explicitly returned by using fallocate FALLOC_FL_PUNCH_HOLE.
https://bugs.freedesktop.org/show_bug.cgi?id=74632
-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, |