From cd95152b2cfeaffe74a20be3490b625f5cb798b1 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 13 May 2025 09:07:15 -0700
Subject: [PATCH] Fixed crash if out of memory in the Vulkan GPU driver
---
src/gpu/vulkan/SDL_gpu_vulkan.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c
index 8fc3af87ce754..449ee33328ac0 100644
--- a/src/gpu/vulkan/SDL_gpu_vulkan.c
+++ b/src/gpu/vulkan/SDL_gpu_vulkan.c
@@ -4785,7 +4785,7 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
windowData->inFlightFences[i] = NULL;
}
-
+
windowData->renderFinishedSemaphore = SDL_malloc(
sizeof(VkSemaphore) * windowData->imageCount);
for (i = 0; i < windowData->imageCount; i += 1) {
@@ -11610,7 +11610,7 @@ static bool VULKAN_PrepareDriver(SDL_VideoDevice *_this)
{
// Set up dummy VulkanRenderer
VulkanRenderer *renderer;
- Uint8 result;
+ bool result = false;
if (_this->Vulkan_CreateSurface == NULL) {
return false;
@@ -11620,16 +11620,16 @@ static bool VULKAN_PrepareDriver(SDL_VideoDevice *_this)
return false;
}
- renderer = (VulkanRenderer *)SDL_malloc(sizeof(VulkanRenderer));
- SDL_memset(renderer, '\0', sizeof(VulkanRenderer));
-
- result = VULKAN_INTERNAL_PrepareVulkan(renderer);
-
- if (result) {
- renderer->vkDestroyInstance(renderer->instance, NULL);
+ renderer = (VulkanRenderer *)SDL_calloc(1, sizeof(*renderer));
+ if (renderer) {
+ result = VULKAN_INTERNAL_PrepareVulkan(renderer);
+ if (result) {
+ renderer->vkDestroyInstance(renderer->instance, NULL);
+ }
+ SDL_free(renderer);
}
- SDL_free(renderer);
SDL_Vulkan_UnloadLibrary();
+
return result;
}
@@ -11650,8 +11650,12 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
return NULL;
}
- renderer = (VulkanRenderer *)SDL_malloc(sizeof(VulkanRenderer));
- SDL_memset(renderer, '\0', sizeof(VulkanRenderer));
+ renderer = (VulkanRenderer *)SDL_calloc(1, sizeof(*renderer));
+ if (!renderer) {
+ SDL_Vulkan_UnloadLibrary();
+ return false;
+ }
+
renderer->debugMode = debugMode;
renderer->preferLowPower = preferLowPower;
renderer->allowedFramesInFlight = 2;