=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: libs/vkd3d-shader: Validate DXBC data size.

Alexandre Julliard julliard at winehq.org
Wed Apr 11 11:58:36 CDT 2018


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Apr 11 13:21:41 2018 +0200

libs/vkd3d-shader: Validate DXBC data size.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/dxbc.c                 | 12 +++++++++---
 libs/vkd3d-shader/vkd3d_shader_private.h |  1 +
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 49e2c50..0b5c3cf 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -1808,7 +1808,7 @@ static const char *shader_get_string(const char *data, size_t data_size, DWORD o
     return data + offset;
 }
 
-static int parse_dxbc(const char *data, SIZE_T data_size,
+static int parse_dxbc(const char *data, size_t data_size,
         int (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx)
 {
     const char *ptr = data;
@@ -1819,6 +1819,12 @@ static int parse_dxbc(const char *data, SIZE_T data_size,
     DWORD version;
     DWORD tag;
 
+    if (data_size < VKD3D_DXBC_HEADER_SIZE)
+    {
+        WARN("Invalid data size %zu.\n", data_size);
+        return VKD3D_ERROR_INVALID_ARGUMENT;
+    }
+
     read_dword(&ptr, &tag);
     TRACE("tag: %#x.\n", tag);
 
@@ -1856,7 +1862,7 @@ static int parse_dxbc(const char *data, SIZE_T data_size,
 
         if (chunk_offset >= data_size || !require_space(chunk_offset, 2, sizeof(DWORD), data_size))
         {
-            WARN("Invalid chunk offset %#x (data size %#lx).\n", chunk_offset, data_size);
+            WARN("Invalid chunk offset %#x (data size %zu).\n", chunk_offset, data_size);
             return VKD3D_ERROR_INVALID_ARGUMENT;
         }
 
@@ -1867,7 +1873,7 @@ static int parse_dxbc(const char *data, SIZE_T data_size,
 
         if (!require_space(chunk_ptr - data, 1, chunk_size, data_size))
         {
-            WARN("Invalid chunk size %#x (data size %#lx, chunk offset %#x).\n",
+            WARN("Invalid chunk size %#x (data size %zu, chunk offset %#x).\n",
                     chunk_size, data_size, chunk_offset);
             return VKD3D_ERROR_INVALID_ARGUMENT;
         }
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 9c43a46..04e6b09 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -858,5 +858,6 @@ static inline unsigned int vkd3d_swizzle_get_component(DWORD swizzle,
 }
 
 #define VKD3D_DXBC_MAX_SOURCE_COUNT 6
+#define VKD3D_DXBC_HEADER_SIZE (8 * sizeof(uint32_t))
 
 #endif  /* __VKD3D_SHADER_PRIVATE_H */




More information about the wine-cvs mailing list