Zebediah Figura : vkd3d: Introduce a vkd3d_bound_range() helper.

Alexandre Julliard julliard at winehq.org
Tue Jul 27 15:38:19 CDT 2021


Module: vkd3d
Branch: master
Commit: bcf272aa0bf3c67b8d698531a3d77c472a935cc5
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=bcf272aa0bf3c67b8d698531a3d77c472a935cc5

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Mon Jul 26 15:51:28 2021 -0500

vkd3d: Introduce a vkd3d_bound_range() helper.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 configure.ac                   |  1 +
 include/private/vkd3d_common.h | 11 +++++++++++
 libs/vkd3d/command.c           |  4 ++--
 libs/vkd3d/device.c            |  3 +--
 4 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/configure.ac b/configure.ac
index 275bca2..88d58e4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -127,6 +127,7 @@ AS_IF([test "x$with_xcb" != "xno"],
 dnl Check for functions
 VKD3D_CHECK_FUNC([HAVE_BUILTIN_CLZ], [__builtin_clz], [__builtin_clz(0)])
 VKD3D_CHECK_FUNC([HAVE_BUILTIN_POPCOUNT], [__builtin_popcount], [__builtin_popcount(0)])
+VKD3D_CHECK_FUNC([HAVE_BUILTIN_ADD_OVERFLOW], [__builtin_add_overflow], [__builtin_add_overflow(0, 0, (int *)0)])
 VKD3D_CHECK_FUNC([HAVE_SYNC_ADD_AND_FETCH], [__sync_add_and_fetch], [__sync_add_and_fetch((int *)0, 0)])
 VKD3D_CHECK_FUNC([HAVE_SYNC_SUB_AND_FETCH], [__sync_sub_and_fetch], [__sync_sub_and_fetch((int *)0, 0)])
 
diff --git a/include/private/vkd3d_common.h b/include/private/vkd3d_common.h
index 23495fc..e25ee90 100644
--- a/include/private/vkd3d_common.h
+++ b/include/private/vkd3d_common.h
@@ -134,6 +134,17 @@ static inline void *vkd3d_memmem( const void *haystack, size_t haystack_len, con
     return NULL;
 }
 
+static inline bool vkd3d_bound_range(size_t start, size_t count, size_t limit)
+{
+#ifdef HAVE_BUILTIN_ADD_OVERFLOW
+    size_t sum;
+
+    return !__builtin_add_overflow(start, count, &sum) && sum <= limit;
+#else
+    return start <= limit && count <= limit - start;
+#endif
+}
+
 static inline int ascii_isupper(int c)
 {
     return 'A' <= c && c <= 'Z';
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 614d19e..93c519a 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -4422,7 +4422,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetVertexBuffers(ID3D12Graphi
     null_resources = &list->device->null_resources;
     gpu_va_allocator = &list->device->gpu_va_allocator;
 
-    if (start_slot >= ARRAY_SIZE(list->strides) || view_count > ARRAY_SIZE(list->strides) - start_slot)
+    if (!vkd3d_bound_range(start_slot, view_count, ARRAY_SIZE(list->strides)))
     {
         WARN("Invalid start slot %u / view count %u.\n", start_slot, view_count);
         return;
@@ -4477,7 +4477,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_SOSetTargets(ID3D12GraphicsComm
         return;
     }
 
-    if (start_slot >= ARRAY_SIZE(buffers) || view_count > ARRAY_SIZE(buffers) - start_slot)
+    if (!vkd3d_bound_range(start_slot, view_count, ARRAY_SIZE(buffers)))
     {
         WARN("Invalid start slot %u / view count %u.\n", start_slot, view_count);
         return;
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 159bc47..be0bf2f 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -3515,8 +3515,7 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i
 
     array_size = d3d12_resource_desc_get_layer_count(desc);
 
-    if (first_sub_resource >= desc->MipLevels * array_size
-            || sub_resource_count > desc->MipLevels * array_size - first_sub_resource)
+    if (!vkd3d_bound_range(first_sub_resource, sub_resource_count, desc->MipLevels * array_size))
     {
         WARN("Invalid sub-resource range %u-%u for resource.\n", first_sub_resource, sub_resource_count);
         return;




More information about the wine-cvs mailing list