mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Merge pull request #3463 from ReinUsesLisp/vk-toctou
vk_swapchain: Silence TOCTOU race condition
This commit is contained in:
		@@ -141,11 +141,6 @@ void VKSwapchain::CreateSwapchain(const vk::SurfaceCapabilitiesKHR& capabilities
 | 
			
		||||
 | 
			
		||||
    const vk::SurfaceFormatKHR surface_format{ChooseSwapSurfaceFormat(formats, srgb)};
 | 
			
		||||
    const vk::PresentModeKHR present_mode{ChooseSwapPresentMode(present_modes)};
 | 
			
		||||
    extent = ChooseSwapExtent(capabilities, width, height);
 | 
			
		||||
 | 
			
		||||
    current_width = extent.width;
 | 
			
		||||
    current_height = extent.height;
 | 
			
		||||
    current_srgb = srgb;
 | 
			
		||||
 | 
			
		||||
    u32 requested_image_count{capabilities.minImageCount + 1};
 | 
			
		||||
    if (capabilities.maxImageCount > 0 && requested_image_count > capabilities.maxImageCount) {
 | 
			
		||||
@@ -153,10 +148,9 @@ void VKSwapchain::CreateSwapchain(const vk::SurfaceCapabilitiesKHR& capabilities
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vk::SwapchainCreateInfoKHR swapchain_ci(
 | 
			
		||||
        {}, surface, requested_image_count, surface_format.format, surface_format.colorSpace,
 | 
			
		||||
        extent, 1, vk::ImageUsageFlagBits::eColorAttachment, {}, {}, {},
 | 
			
		||||
        capabilities.currentTransform, vk::CompositeAlphaFlagBitsKHR::eOpaque, present_mode, false,
 | 
			
		||||
        {});
 | 
			
		||||
        {}, surface, requested_image_count, surface_format.format, surface_format.colorSpace, {}, 1,
 | 
			
		||||
        vk::ImageUsageFlagBits::eColorAttachment, {}, {}, {}, capabilities.currentTransform,
 | 
			
		||||
        vk::CompositeAlphaFlagBitsKHR::eOpaque, present_mode, false, {});
 | 
			
		||||
 | 
			
		||||
    const u32 graphics_family{device.GetGraphicsFamily()};
 | 
			
		||||
    const u32 present_family{device.GetPresentFamily()};
 | 
			
		||||
@@ -169,9 +163,18 @@ void VKSwapchain::CreateSwapchain(const vk::SurfaceCapabilitiesKHR& capabilities
 | 
			
		||||
        swapchain_ci.imageSharingMode = vk::SharingMode::eExclusive;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Request the size again to reduce the possibility of a TOCTOU race condition.
 | 
			
		||||
    const auto updated_capabilities = physical_device.getSurfaceCapabilitiesKHR(surface, dld);
 | 
			
		||||
    swapchain_ci.imageExtent = ChooseSwapExtent(updated_capabilities, width, height);
 | 
			
		||||
    // Don't add code within this and the swapchain creation.
 | 
			
		||||
    const auto dev{device.GetLogical()};
 | 
			
		||||
    swapchain = dev.createSwapchainKHRUnique(swapchain_ci, nullptr, dld);
 | 
			
		||||
 | 
			
		||||
    extent = swapchain_ci.imageExtent;
 | 
			
		||||
    current_width = extent.width;
 | 
			
		||||
    current_height = extent.height;
 | 
			
		||||
    current_srgb = srgb;
 | 
			
		||||
 | 
			
		||||
    images = dev.getSwapchainImagesKHR(*swapchain, dld);
 | 
			
		||||
    image_count = static_cast<u32>(images.size());
 | 
			
		||||
    image_format = surface_format.format;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user