[PATCH vkd3d 3/5] vkd3d-shader: Validate DXBC checksums.
Henri Verbeet
hverbeet at codeweavers.com
Thu Jul 23 04:11:27 CDT 2020
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
libs/vkd3d-shader/dxbc.c | 18 ++++++++++++++++--
libs/vkd3d-shader/vkd3d_shader_private.h | 1 +
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index b5c5c77..5a070ad 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -1944,6 +1944,7 @@ static const char *shader_get_string(const char *data, size_t data_size, DWORD o
static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_message_context *message_context,
int (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx)
{
+ uint32_t checksum[4], calculated_checksum[4];
const char *ptr = data;
int ret = VKD3D_OK;
DWORD chunk_count;
@@ -1970,8 +1971,21 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
return VKD3D_ERROR_INVALID_ARGUMENT;
}
- WARN("Ignoring DXBC checksum.\n");
- skip_dword_unknown(&ptr, 4);
+ read_dword(&ptr, &checksum[0]);
+ read_dword(&ptr, &checksum[1]);
+ read_dword(&ptr, &checksum[2]);
+ read_dword(&ptr, &checksum[3]);
+ vkd3d_compute_dxbc_checksum(data, data_size, calculated_checksum);
+ if (memcmp(checksum, calculated_checksum, sizeof(checksum)))
+ {
+ WARN("Checksum {0x%08x, 0x%08x, 0x%08x, 0x%08x} does not match "
+ "calculated checksum {0x%08x, 0x%08x, 0x%08x, 0x%08x}.\n",
+ checksum[0], checksum[1], checksum[2], checksum[3],
+ calculated_checksum[0], calculated_checksum[1],
+ calculated_checksum[2], calculated_checksum[3]);
+ vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_CHECKSUM, "Invalid DXBC checksum.");
+ return VKD3D_ERROR_INVALID_ARGUMENT;
+ }
read_dword(&ptr, &version);
TRACE("version: %#x.\n", version);
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 5cf8e8e..40f986b 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -63,6 +63,7 @@ enum vkd3d_shader_error
{
VKD3D_SHADER_ERROR_DXBC_INVALID_SIZE = 1,
VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC = 2,
+ VKD3D_SHADER_ERROR_DXBC_INVALID_CHECKSUM = 3,
};
enum VKD3D_SHADER_INSTRUCTION_HANDLER
--
2.11.0
More information about the wine-devel
mailing list