From 116b1de2aaebf046df449b198bbc22d0959863af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= Date: Fri, 13 Jan 2023 13:42:26 +0100 Subject: [PATCH] vulkan/wsi: check if image info was already freed We set the different data being freed to NULL after freeing it, and checks for NULL before freeing it. This fixes several double free crash with v3dv, when running OOM wsi tests, like for example: dEQP-VK.wsi.xlib.swapchain.simulate_oom.composite_alpha Although note that only one person got those on a new fresh install of the Raspbian OS, so this problem was rare. Fixes: 5b13d74583513ddd029e ("vulkan/wsi/drm: Break create_native_image in pieces") Reviewed-by: Eric Engestrom Part-of: (cherry picked from commit b27e42dcb5f995ef0b7f8d07d5868eed60896b59) --- .pick_status.json | 2 +- src/vulkan/wsi/wsi_common.c | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index abb45ef79b1..7a9f3a7ca96 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4999,7 +4999,7 @@ "description": "vulkan/wsi: check if image info was already freed", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "5b13d74583513ddd029e30c989838b96993545a0" }, diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 5532c44d7b0..b2974fad7ce 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -578,10 +578,22 @@ void wsi_destroy_image_info(const struct wsi_swapchain *chain, struct wsi_image_info *info) { - vk_free(&chain->alloc, (void *)info->create.pQueueFamilyIndices); - vk_free(&chain->alloc, (void *)info->format_list.pViewFormats); - vk_free(&chain->alloc, (void *)info->drm_mod_list.pDrmFormatModifiers); - vk_free(&chain->alloc, info->modifier_props); + if (info->create.pQueueFamilyIndices != NULL) { + vk_free(&chain->alloc, (void *)info->create.pQueueFamilyIndices); + info->create.pQueueFamilyIndices = NULL; + } + if (info->format_list.pViewFormats != NULL) { + vk_free(&chain->alloc, (void *)info->format_list.pViewFormats); + info->format_list.pViewFormats = NULL; + } + if (info->drm_mod_list.pDrmFormatModifiers != NULL) { + vk_free(&chain->alloc, (void *)info->drm_mod_list.pDrmFormatModifiers); + info->drm_mod_list.pDrmFormatModifiers = NULL; + } + if (info->modifier_props != NULL) { + vk_free(&chain->alloc, info->modifier_props); + info->modifier_props = NULL; + } } VkResult