From 8056058aa1983bafc8cb8a7ec2e3a3876dbdc341 Mon Sep 17 00:00:00 2001 From: Francisco Casas Date: Wed, 18 Dec 2024 17:02:44 -0300 Subject: [PATCH] vkd3d-shader: Avoid passing NULL to memset(). (ubsan) Otherwise ubsan reports errors such as: libs/vkd3d-shader/spirv.c:7266:5: runtime error: null pointer passed as argument 1, which is declared to never be null --- libs/vkd3d-shader/spirv.c | 5 +++-- libs/vkd3d-shader/vkd3d_shader_main.c | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index db15c5bb..ee188116 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -7259,12 +7259,13 @@ static void spirv_compiler_emit_shader_epilogue_invocation(struct spirv_compiler static void spirv_compiler_emit_hull_shader_main(struct spirv_compiler *compiler) { + size_t table_count = compiler->offset_info.descriptor_table_count; struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; uint32_t void_id; /* If a patch constant function used descriptor indexing the offsets must be reloaded. */ - memset(compiler->descriptor_offset_ids, 0, compiler->offset_info.descriptor_table_count - * sizeof(*compiler->descriptor_offset_ids)); + if (table_count) + memset(compiler->descriptor_offset_ids, 0, table_count * sizeof(*compiler->descriptor_offset_ids)); vkd3d_spirv_builder_begin_main_function(builder); vkd3d_spirv_build_op_label(builder, vkd3d_spirv_alloc_id(builder)); diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index e30dc935..0bc23fe6 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -379,7 +379,8 @@ size_t bytecode_align(struct vkd3d_bytecode_buffer *buffer) return aligned_size; } - memset(buffer->data + buffer->size, 0xab, aligned_size - buffer->size); + if (aligned_size > buffer->size) + memset(&buffer->data[buffer->size], 0xab, aligned_size - buffer->size); buffer->size = aligned_size; return aligned_size; }