summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocol/wayland.xml3
-rw-r--r--src/wayland-shm.c10
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,