From 61de3131981c60c4935337586e88698b8ddc46f6 Mon Sep 17 00:00:00 2001 From: Sebastian Keller Date: Mon, 6 Nov 2023 21:18:30 +0100 Subject: [PATCH] cogl: Unconditionally free pipeline shader/program state cache struct destroy_shader_state()/destroy_program_state() are called when the qdata pointer to the state cache structure gets overwritten, but were only conditionally destroying it. This lead to leaks when called with a shader/program state ref count > 1. Fixes: 9b9e12edb ("cogl: Port Node/Pipeline/PipelineLayer away from CoglObject") Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3141 Part-of: --- cogl/cogl/driver/gl/cogl-pipeline-fragend-glsl.c | 3 ++- cogl/cogl/driver/gl/cogl-pipeline-progend-glsl.c | 3 ++- cogl/cogl/driver/gl/cogl-pipeline-vertend-glsl.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cogl/cogl/driver/gl/cogl-pipeline-fragend-glsl.c b/cogl/cogl/driver/gl/cogl-pipeline-fragend-glsl.c index 0806d6a85..3a4c6f90a 100644 --- a/cogl/cogl/driver/gl/cogl-pipeline-fragend-glsl.c +++ b/cogl/cogl/driver/gl/cogl-pipeline-fragend-glsl.c @@ -164,8 +164,9 @@ destroy_shader_state (void *user_data) g_free (shader_state->unit_state); g_free (shader_state); - g_free (cache); } + + g_free (cache); } static void diff --git a/cogl/cogl/driver/gl/cogl-pipeline-progend-glsl.c b/cogl/cogl/driver/gl/cogl-pipeline-progend-glsl.c index 4014d3e10..03bcf4956 100644 --- a/cogl/cogl/driver/gl/cogl-pipeline-progend-glsl.c +++ b/cogl/cogl/driver/gl/cogl-pipeline-progend-glsl.c @@ -298,8 +298,9 @@ destroy_program_state (void *user_data) g_array_free (program_state->uniform_locations, TRUE); g_free (program_state); - g_free (cache); } + + g_free (cache); } static void diff --git a/cogl/cogl/driver/gl/cogl-pipeline-vertend-glsl.c b/cogl/cogl/driver/gl/cogl-pipeline-vertend-glsl.c index 09bc929c2..6f833f236 100644 --- a/cogl/cogl/driver/gl/cogl-pipeline-vertend-glsl.c +++ b/cogl/cogl/driver/gl/cogl-pipeline-vertend-glsl.c @@ -121,8 +121,9 @@ destroy_shader_state (void *user_data) GE( ctx, glDeleteShader (shader_state->gl_shader) ); g_free (shader_state); - g_free (cache); } + + g_free (cache); } static void