Mesa (8.0): mesa: Prevent repeated glDeleteShader() from blowing away our refcounts.

Ian Romanick idr at kemper.freedesktop.org
Sat Oct 13 03:07:53 UTC 2012


Module: Mesa
Branch: 8.0
Commit: f9aefaeb274a480579e7b8437003bdf92d839153
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9aefaeb274a480579e7b8437003bdf92d839153

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Thu Jul 19 13:41:34 2012 -0700

mesa: Prevent repeated glDeleteShader() from blowing away our refcounts.

Calling glDeleteShader() should mark shaders as pending for deletion,
but shouldn't decrement the refcount every time.  Otherwise, repeated
glDeleteShader() is not safe.

This is particularly bad since glDeleteProgram() frees shaders: if you
first call glDeleteShader() on the shaders attached to the program (thus
decrementing the refcount), then called glDeleteProgram(), it would try
to free them again (decrementing the refcount another time), causing
a refcount > 0 assertion to fail.

Similar to commit d950a778.

NOTE: This is a candidate for the 8.0 branch.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Brian Paul <brianp at vmware.com>
(cherry picked from commit c3bc41011f9ffe648b7dd4915c6202b776cd1ab4)

---

 src/mesa/main/shaderapi.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 8b68ebf..7c70aa6 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -404,10 +404,12 @@ delete_shader(struct gl_context *ctx, GLuint shader)
    if (!sh)
       return;
 
-   sh->DeletePending = GL_TRUE;
+   if (!sh->DeletePending) {
+      sh->DeletePending = GL_TRUE;
 
-   /* effectively, decr sh's refcount */
-   _mesa_reference_shader(ctx, &sh, NULL);
+      /* effectively, decr sh's refcount */
+      _mesa_reference_shader(ctx, &sh, NULL);
+   }
 }
 
 




More information about the mesa-commit mailing list