vkd3d-shader/dxbc: Output messages for invalid semantic name references in shader_parse_signature().

This commit is contained in:
Henri Verbeet
2025-02-05 16:34:14 +01:00
parent 3bcdb85ddc
commit b8d740ebfc
Notes: Henri Verbeet 2025-02-24 16:26:29 +01:00
Approved-by: Conor McCarthy (@cmccarthy)
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1371
2 changed files with 13 additions and 8 deletions

View File

@@ -381,7 +381,8 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
uint32_t count, header_size;
struct signature_element *e;
const char *ptr = data;
unsigned int i, j;
bool fail = false;
unsigned int i;
if (!require_space(0, 2, sizeof(uint32_t), section->data.size))
{
@@ -436,13 +437,10 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
if (!(name = shader_get_string(data, section->data.size, name_offset))
|| !(e[i].semantic_name = vkd3d_strdup(name)))
{
WARN("Invalid name offset %#zx (data size %#zx).\n", name_offset, section->data.size);
for (j = 0; j < i; ++j)
{
vkd3d_free((void *)e[j].semantic_name);
}
vkd3d_free(e);
return VKD3D_ERROR_INVALID_ARGUMENT;
vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_DXBC_INVALID_STRING_REFERENCE,
"Element %u has invalid semantic name reference %#zx (data size %#zx).\n",
i, name_offset, section->data.size);
fail = true;
}
e[i].semantic_index = read_u32(&ptr);
e[i].sysval_semantic = read_u32(&ptr);
@@ -480,6 +478,12 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
s->elements_capacity = count;
s->element_count = count;
if (fail)
{
shader_signature_cleanup(s);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
return VKD3D_OK;
}

View File

@@ -74,6 +74,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_SIZE = 6,
VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY = 7,
VKD3D_SHADER_ERROR_DXBC_INVALID_SIGNATURE = 8,
VKD3D_SHADER_ERROR_DXBC_INVALID_STRING_REFERENCE = 9,
VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF = 1000,
VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_RANGE = 1001,