anv: Protect memcpy/memset/qsort calls against NULL arguments

Avoids sanitizer errors like:

```
../src/intel/vulkan/anv_pipeline_cache.c:409:4: runtime error: null pointer passed as argument 1, which is declared to never be null
../src/intel/vulkan/anv_descriptor_set.c:696:4: runtime error: null pointer passed as argument 1, which is declared to never be null
../src/intel/vulkan/anv_descriptor_set.c:2709:10: runtime error: null pointer passed as argument 1, which is declared to never be null
../src/intel/vulkan/anv_descriptor_set.c:2709:10: runtime error: null pointer passed as argument 2, which is declared to never be null
```

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32098>
This commit is contained in:
Matt Turner 2024-11-10 13:10:31 -05:00 committed by Marge Bot
parent 6e544214d5
commit b6d11ba5b4
3 changed files with 32 additions and 21 deletions

View file

@ -1536,8 +1536,10 @@ intel_perf_init_metrics(struct intel_perf_config *perf_cfg,
load_oa_metrics(perf_cfg, drm_fd, devinfo);
/* sort query groups by name */
qsort(perf_cfg->queries, perf_cfg->n_queries,
sizeof(perf_cfg->queries[0]), intel_perf_compare_query_names);
if (perf_cfg->queries != NULL) {
qsort(perf_cfg->queries, perf_cfg->n_queries,
sizeof(perf_cfg->queries[0]), intel_perf_compare_query_names);
}
build_unique_counter_list(perf_cfg);

View file

@ -693,7 +693,10 @@ VkResult anv_CreateDescriptorSetLayout(
}
/* Initialize all samplers to 0 */
memset(samplers, 0, immutable_sampler_count * sizeof(*samplers));
assert((samplers == NULL) == (immutable_sampler_count == 0));
if (samplers != NULL) {
memset(samplers, 0, immutable_sampler_count * sizeof(*samplers));
}
uint32_t buffer_view_count = 0;
uint32_t dynamic_offset_count = 0;
@ -2699,20 +2702,27 @@ void anv_UpdateDescriptorSets(
* - RENDER_SURFACE_STATE
* - SAMPLER_STATE
*/
memcpy(dst->desc_surface_mem.map +
dst_layout->descriptor_surface_offset +
(copy->dstArrayElement + j) * dst_layout->descriptor_surface_stride,
src->desc_surface_mem.map +
src_layout->descriptor_surface_offset +
(copy->srcArrayElement + j) * src_layout->descriptor_surface_stride,
copy_surface_element_size);
memcpy(dst->desc_sampler_mem.map +
dst_layout->descriptor_sampler_offset +
(copy->dstArrayElement + j) * dst_layout->descriptor_sampler_stride,
src->desc_sampler_mem.map +
src_layout->descriptor_sampler_offset +
(copy->srcArrayElement + j) * src_layout->descriptor_sampler_stride,
copy_sampler_element_size);
assert((dst->desc_surface_mem.map == NULL) == (src->desc_surface_mem.map == NULL));
if (dst->desc_surface_mem.map) {
memcpy(dst->desc_surface_mem.map +
dst_layout->descriptor_surface_offset +
(copy->dstArrayElement + j) * dst_layout->descriptor_surface_stride,
src->desc_surface_mem.map +
src_layout->descriptor_surface_offset +
(copy->srcArrayElement + j) * src_layout->descriptor_surface_stride,
copy_surface_element_size);
}
assert((dst->desc_sampler_mem.map == NULL) == (src->desc_sampler_mem.map == NULL));
if (dst->desc_sampler_mem.map) {
memcpy(dst->desc_sampler_mem.map +
dst_layout->descriptor_sampler_offset +
(copy->dstArrayElement + j) * dst_layout->descriptor_sampler_stride,
src->desc_sampler_mem.map +
src_layout->descriptor_sampler_offset +
(copy->srcArrayElement + j) * src_layout->descriptor_sampler_stride,
copy_sampler_element_size);
}
/* Copy the CPU side data anv_descriptor */
*dst_desc = *src_desc;

View file

@ -287,8 +287,8 @@ anv_shader_bin_create(struct anv_device *device,
INTEL_DEBUG(DEBUG_SHADER_PRINT) ?
brw_stage_prog_data_printf_string_size(prog_data_in) : 0);
if (!vk_multialloc_alloc(&ma, &device->vk.alloc,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE))
if (!vk_multialloc_zalloc(&ma, &device->vk.alloc,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE))
return NULL;
memcpy(obj_key_data, key_data, key_size);
@ -406,14 +406,13 @@ anv_shader_bin_create(struct anv_device *device,
typed_memcpy(prog_data_relocs, prog_data_in->relocs,
prog_data_in->num_relocs);
prog_data->relocs = prog_data_relocs;
memset(prog_data_param, 0,
prog_data->nr_params * sizeof(*prog_data_param));
prog_data->param = prog_data_param;
prog_data->printf_info = printf_infos;
shader->prog_data = prog_data;
shader->prog_data_size = prog_data_size;
assert(num_stats <= ARRAY_SIZE(shader->stats));
assert((stats != NULL) || (num_stats == 0));
typed_memcpy(shader->stats, stats, num_stats);
shader->num_stats = num_stats;