From 3be0d4af6ad9918d682681ae33f1097e8561a001 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 7 Nov 2011 00:45:13 -0500 Subject: [PATCH] Fixed double-free in the shader cache at shutdown --- src/render/opengles2/SDL_render_gles2.c | 36 ++++++++++++++++--------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index fc3a9d31f..46f6933f0 100644 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -190,24 +190,34 @@ static void GLES2_DestroyRenderer(SDL_Renderer *renderer) { GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata; - GLES2_ProgramCacheEntry *entry; - GLES2_ProgramCacheEntry *next; /* Deallocate everything */ if (rdata) { GLES2_ActivateRenderer(renderer); - entry = rdata->program_cache.head; - while (entry) { - glDeleteShader(entry->vertex_shader->id); - glDeleteShader(entry->fragment_shader->id); - SDL_free(entry->vertex_shader); - SDL_free(entry->fragment_shader); - glDeleteProgram(entry->id); - next = entry->next; - SDL_free(entry); - entry = next; - } + { + GLES2_ShaderCacheEntry *entry; + GLES2_ShaderCacheEntry *next; + entry = rdata->shader_cache.head; + while (entry) + { + glDeleteShader(entry->id); + next = entry->next; + SDL_free(entry); + entry = next; + } + } + { + GLES2_ProgramCacheEntry *entry; + GLES2_ProgramCacheEntry *next; + entry = rdata->program_cache.head; + while (entry) { + glDeleteProgram(entry->id); + next = entry->next; + SDL_free(entry); + entry = next; + } + } if (rdata->context) { SDL_GL_DeleteContext(rdata->context); }