SDL: vulkan: move temporary pointer to its own field to prevent a bad dereference.

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) {