Mesa (main): radv: Copy shader modules to avoid use after free
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Apr 26 18:57:08 UTC 2022
Module: Mesa
Branch: main
Commit: aeeb0b4deb3f3b2ddfdc5aa01883764e748a1b88
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=aeeb0b4deb3f3b2ddfdc5aa01883764e748a1b88
Author: Konstantin Seurer <konstantin.seurer at gmail.com>
Date: Tue Apr 19 12:20:08 2022 +0200
radv: Copy shader modules to avoid use after free
The vkd3d-proton ray tracing tests delete shader modules after creating
pipeline libraries from them. This resulted in a use after free when
creating ray tracing pipelines.
Signed-off-by: Konstantin Seurer <konstantin.seurer at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16027>
---
src/amd/vulkan/radv_pipeline.c | 5 +++++
src/amd/vulkan/radv_pipeline_rt.c | 11 ++++++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 4d1a02f73ce..985b5129708 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -240,6 +240,11 @@ radv_pipeline_destroy(struct radv_device *device, struct radv_pipeline *pipeline
free(pipeline->compute.rt_stack_sizes);
} else if (pipeline->type == RADV_PIPELINE_LIBRARY) {
free(pipeline->library.groups);
+ for (uint32_t i = 0; i < pipeline->library.stage_count; i++) {
+ RADV_FROM_HANDLE(vk_shader_module, module, pipeline->library.stages[i].module);
+ vk_object_base_finish(&module->base);
+ ralloc_free(module);
+ }
free(pipeline->library.stages);
}
diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c
index cb94ede62da..02d27ef8942 100644
--- a/src/amd/vulkan/radv_pipeline_rt.c
+++ b/src/amd/vulkan/radv_pipeline_rt.c
@@ -109,12 +109,21 @@ radv_rt_pipeline_library_create(VkDevice _device, VkPipelineCache _cache,
goto fail;
if (local_create_info.stageCount) {
- size_t size = sizeof(VkPipelineShaderStageCreateInfo) * local_create_info.stageCount;
pipeline->library.stage_count = local_create_info.stageCount;
+
+ size_t size = sizeof(VkPipelineShaderStageCreateInfo) * local_create_info.stageCount;
pipeline->library.stages = malloc(size);
if (!pipeline->library.stages)
goto fail;
+
memcpy(pipeline->library.stages, local_create_info.pStages, size);
+
+ for (uint32_t i = 0; i < local_create_info.stageCount; i++) {
+ RADV_FROM_HANDLE(vk_shader_module, module, pipeline->library.stages[i].module);
+
+ struct vk_shader_module *new_module = vk_shader_module_clone(NULL, module);
+ pipeline->library.stages[i].module = vk_shader_module_to_handle(new_module);
+ }
}
if (local_create_info.groupCount) {
More information about the mesa-commit
mailing list