From 6b7dad7d82801e5aa1ec6c733913c6e3c86971d7 Mon Sep 17 00:00:00 2001
From: Katelyn Gadd <[EMAIL REDACTED]>
Date: Mon, 20 Jan 2025 22:25:16 -0500
Subject: [PATCH] vulkan: move temporary pointer to its own field to prevent a
bad dereference.
Reference Issue #11075.
---
src/gpu/vulkan/SDL_gpu_vulkan.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c
index 6bf12b0f23d51..bf300a1a8d3aa 100644
--- a/src/gpu/vulkan/SDL_gpu_vulkan.c
+++ b/src/gpu/vulkan/SDL_gpu_vulkan.c
@@ -479,6 +479,7 @@ static VkSamplerAddressMode SDLToVK_SamplerAddressMode[] = {
typedef struct VulkanMemoryAllocation VulkanMemoryAllocation;
typedef struct VulkanBuffer VulkanBuffer;
typedef struct VulkanBufferContainer VulkanBufferContainer;
+typedef struct VulkanUniformBuffer VulkanUniformBuffer;
typedef struct VulkanTexture VulkanTexture;
typedef struct VulkanTextureContainer VulkanTextureContainer;
@@ -573,6 +574,7 @@ struct VulkanBuffer
SDL_AtomicInt referenceCount;
bool transitioned;
bool markedForDestroy; // so that defrag doesn't double-free
+ VulkanUniformBuffer *uniformBufferForDefrag;
};
struct VulkanBufferContainer
@@ -6811,7 +6813,7 @@ static VulkanUniformBuffer *VULKAN_INTERNAL_CreateUniformBuffer(
uniformBuffer->drawOffset = 0;
uniformBuffer->writeOffset = 0;
- uniformBuffer->buffer->container = (VulkanBufferContainer *)uniformBuffer; // little hack for defrag
+ uniformBuffer->buffer->uniformBufferForDefrag = uniformBuffer;
return uniformBuffer;
}
@@ -10691,7 +10693,7 @@ static bool VULKAN_INTERNAL_DefragmentMemory(
newBuffer->container = currentRegion->vulkanBuffer->container;
newBuffer->containerIndex = currentRegion->vulkanBuffer->containerIndex;
if (newBuffer->type == VULKAN_BUFFER_TYPE_UNIFORM) {
- ((VulkanUniformBuffer *)newBuffer->container)->buffer = newBuffer;
+ currentRegion->vulkanBuffer->uniformBufferForDefrag->buffer = newBuffer;
} else {
newBuffer->container->buffers[newBuffer->containerIndex] = newBuffer;
if (newBuffer->container->activeBuffer == currentRegion->vulkanBuffer) {