From 5eeeaf4780a1939e92f2872bffb85fff6b9b4069 Mon Sep 17 00:00:00 2001 From: David Gow Date: Tue, 4 Jun 2024 17:05:45 +0800 Subject: [PATCH] render: Mark an already-destroyed renderer as freed It's possible to destroy an SDL_Renderer without freeing it using SDL_DestroyRendererWithoutFreeing(), which is used to make it possible to destroy windows and their renderers in either order. However, if a renderer has already been destroyed before it is freed (e.g., the window was destroyed before the renderer), the object is never marked invalid. This means the SDL_Renderer is reported as leaked, even if SDL_DestroyRenderer() is called. SDL_GetWindowSurface() will trigger this, as the window texture is cleaned up _after_ the window destroys its associated renderer. This makes it impossible to use SDL_FRAMEBUFFER_ACCELERATION without triggering a leak warning. Fix this by unconditionally marking the SDL_Renderer object as invalid in SDL_DestroyRenderer(). --- src/render/SDL_render.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 3c72633047..06dfc4142f 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -4595,8 +4595,8 @@ void SDL_DestroyRenderer(SDL_Renderer *renderer) // in either order. if (!renderer->destroyed) { SDL_DestroyRendererWithoutFreeing(renderer); - SDL_SetObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER, SDL_FALSE); // It's no longer magical... } + SDL_SetObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER, SDL_FALSE); // It's no longer magical... SDL_free(renderer->texture_formats); SDL_free(renderer);