Fixed crash if out of memory in the Vulkan GPU driver

(cherry picked from commit cd95152b2c)
This commit is contained in:
Sam Lantinga
2025-05-13 09:07:15 -07:00
parent 219cb1a59d
commit ed22220bc6

View File

@@ -4818,7 +4818,7 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
windowData->inFlightFences[i] = NULL; windowData->inFlightFences[i] = NULL;
} }
windowData->renderFinishedSemaphore = SDL_malloc( windowData->renderFinishedSemaphore = SDL_malloc(
sizeof(VkSemaphore) * windowData->imageCount); sizeof(VkSemaphore) * windowData->imageCount);
for (i = 0; i < windowData->imageCount; i += 1) { for (i = 0; i < windowData->imageCount; i += 1) {
@@ -11609,7 +11609,7 @@ static bool VULKAN_PrepareDriver(SDL_VideoDevice *_this)
{ {
// Set up dummy VulkanRenderer // Set up dummy VulkanRenderer
VulkanRenderer *renderer; VulkanRenderer *renderer;
Uint8 result; bool result = false;
if (_this->Vulkan_CreateSurface == NULL) { if (_this->Vulkan_CreateSurface == NULL) {
return false; return false;
@@ -11619,16 +11619,16 @@ static bool VULKAN_PrepareDriver(SDL_VideoDevice *_this)
return false; return false;
} }
renderer = (VulkanRenderer *)SDL_malloc(sizeof(VulkanRenderer)); renderer = (VulkanRenderer *)SDL_calloc(1, sizeof(*renderer));
SDL_memset(renderer, '\0', sizeof(VulkanRenderer)); if (renderer) {
result = VULKAN_INTERNAL_PrepareVulkan(renderer);
result = VULKAN_INTERNAL_PrepareVulkan(renderer); if (result) {
renderer->vkDestroyInstance(renderer->instance, NULL);
if (result) { }
renderer->vkDestroyInstance(renderer->instance, NULL); SDL_free(renderer);
} }
SDL_free(renderer);
SDL_Vulkan_UnloadLibrary(); SDL_Vulkan_UnloadLibrary();
return result; return result;
} }
@@ -11644,8 +11644,12 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
return NULL; return NULL;
} }
renderer = (VulkanRenderer *)SDL_malloc(sizeof(VulkanRenderer)); renderer = (VulkanRenderer *)SDL_calloc(1, sizeof(*renderer));
SDL_memset(renderer, '\0', sizeof(VulkanRenderer)); if (!renderer) {
SDL_Vulkan_UnloadLibrary();
return false;
}
renderer->debugMode = debugMode; renderer->debugMode = debugMode;
renderer->preferLowPower = preferLowPower; renderer->preferLowPower = preferLowPower;
renderer->allowedFramesInFlight = 2; renderer->allowedFramesInFlight = 2;