aboutsummaryrefslogtreecommitdiff
path: root/layers/mem_tracker.cpp
diff options
context:
space:
mode:
authorMichael Lentine <mlentine@google.com>2015-10-28 16:26:14 -0700
committerMark Lobodzinski <mark@lunarg.com>2015-11-04 10:23:16 -0700
commit86627d78aced1cde55003eca4fa729176a6a193d (patch)
treecc0e46cbfa6f3ce01dfeb1e864677d9a14018805 /layers/mem_tracker.cpp
parente084c0558898865ae0057efc202de3b3ac07cc88 (diff)
downloadusermoji-86627d78aced1cde55003eca4fa729176a6a193d.tar.xz
layers: Add map range validation.
Merge Request 52
Diffstat (limited to 'layers/mem_tracker.cpp')
-rw-r--r--layers/mem_tracker.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 93b1d8eb..4d3e566f 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -1239,6 +1239,26 @@ VK_LAYER_EXPORT void VKAPI vkFreeMemory(
my_data->device_dispatch_table->FreeMemory(device, mem, pAllocator);
}
+bool validateMemRange(
+ VkDevice device,
+ VkDeviceMemory mem,
+ VkDeviceSize offset,
+ VkDeviceSize size)
+{
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
+ bool skip_call = false;
+
+ auto mem_element = my_data->memObjMap.find(mem);
+ if (mem_element != my_data->memObjMap.end()) {
+ if ((offset + size) > mem_element->second.allocInfo.allocationSize) {
+ skip_call = log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0,
+ MEMTRACK_INVALID_MAP, "MEM", "Mapping Memory from %" PRIu64 " to %" PRIu64 " with total array size %" PRIu64,
+ offset, size + offset, mem_element->second.allocInfo.allocationSize);
+ }
+ }
+ return skip_call;
+}
+
VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(
VkDevice device,
VkDeviceMemory mem,
@@ -1258,6 +1278,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(
skipCall = log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_INVALID_STATE, "MEM",
"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %#" PRIxLEAST64, (uint64_t) mem);
}
+ skipCall |= validateMemRange(device, mem, offset, size);
loader_platform_thread_unlock_mutex(&globalLock);
if (VK_FALSE == skipCall) {
result = my_data->device_dispatch_table->MapMemory(device, mem, offset, size, flags, ppData);