summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2015-05-17 17:56:44 -0400
committerEmil Velikov <emil.l.velikov@gmail.com>2015-05-27 11:46:28 +0100
commit5eef18390d540d679aaeb664fdb2deb7d56e74ae (patch)
tree9d5d8c2071bb244f2ac8a9729233ea29badfa01a
parent34ff020aeac214976bdc152dc5009be9534c6ed7 (diff)
downloadmesa-5eef18390d540d679aaeb664fdb2deb7d56e74ae.tar.gz
glsl: avoid leaking linked gl_shader when there's a late linker error
This makes piglit mixing-clip-distance-and-clip-vertex-disallowed have 0 definitely lost blocks with valgrind. (Same non-0 number of possibly lost blocks though.) Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de> Cc: "10.5 10.6" <mesa-stable@lists.freedesktop.org> (cherry picked from commit 5646f0f18a620292524eebcd77353ff3d3687eb2)
-rw-r--r--src/glsl/linker.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index ecdc025710f..2aa9f05a3f0 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -2829,8 +2829,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
link_intrastage_shaders(mem_ctx, ctx, prog, shader_list[stage],
num_shaders[stage]);
- if (!prog->LinkStatus)
+ if (!prog->LinkStatus) {
+ if (sh)
+ ctx->Driver.DeleteShader(ctx, sh);
goto done;
+ }
switch (stage) {
case MESA_SHADER_VERTEX:
@@ -2843,8 +2846,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
validate_fragment_shader_executable(prog, sh);
break;
}
- if (!prog->LinkStatus)
+ if (!prog->LinkStatus) {
+ if (sh)
+ ctx->Driver.DeleteShader(ctx, sh);
goto done;
+ }
_mesa_reference_shader(ctx, &prog->_LinkedShaders[stage], sh);
}