From f9b69e43a5a94fe9bdc3ef574fd760b0fe6ada9f Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 30 Oct 2021 16:32:47 -0500 Subject: [PATCH] anv: Add a couple more checks in MapMemory Reviwed-by: Paulo Zanoni Part-of: --- src/intel/vulkan/anv_device.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index ede7ddd0faf..8d8530646ef 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -4033,11 +4033,20 @@ VkResult anv_MapMemory( assert(size > 0); assert(offset + size <= mem->bo->size); - /* FIXME: Is this supposed to be thread safe? Since vkUnmapMemory() only - * takes a VkDeviceMemory pointer, it seems like only one map of the memory - * at a time is valid. We could just mmap up front and return an offset - * pointer here, but that may exhaust virtual memory on 32 bit - * userspace. */ + if (size != (size_t)size) { + return vk_errorf(device, VK_ERROR_MEMORY_MAP_FAILED, + "requested size 0x%"PRIx64" does not fit in %u bits", + size, (unsigned)(sizeof(size_t) * 8)); + } + + /* From the Vulkan 1.2.194 spec: + * + * "memory must not be currently host mapped" + */ + if (mem->bo->map != NULL) { + return vk_errorf(device, VK_ERROR_MEMORY_MAP_FAILED, + "Memory object already mapped."); + } uint32_t gem_flags = 0;