Mesa (master): r600: protect cleanup instructions from double free

Andre Maasikas andrem at kemper.freedesktop.org
Thu Sep 9 08:32:45 UTC 2010


Module: Mesa
Branch: master
Commit: 7753416c5b6bdcc757983400c50c5cf878bc9caf
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7753416c5b6bdcc757983400c50c5cf878bc9caf

Author: Andre Maasikas <amaasikas at gmail.com>
Date:   Thu Sep  2 11:09:52 2010 +0300

r600: protect cleanup instructions from double free

We might get the cleanup when we have not translated the shader yet
e.g 2 programstringnotifys in a row

---

 src/mesa/drivers/dri/r600/r700_assembler.c |    9 ++++++++-
 src/mesa/drivers/dri/r600/r700_shader.c    |   13 ++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c
index 9c5a505..5d557f7 100644
--- a/src/mesa/drivers/dri/r600/r700_assembler.c
+++ b/src/mesa/drivers/dri/r600/r700_assembler.c
@@ -8076,20 +8076,27 @@ GLboolean Process_Vertex_Exports(r700_AssemblerBase *pR700AsmCode,
 
 GLboolean Clean_Up_Assembler(r700_AssemblerBase *pR700AsmCode)
 {
-    FREE(pR700AsmCode->pInstDeps);
+    if(NULL != pR700AsmCode->pInstDeps)
+    {
+        FREE(pR700AsmCode->pInstDeps);
+        pR700AsmCode->pInstDeps = NULL;
+    }
 
     if(NULL != pR700AsmCode->subs)
     {
         FREE(pR700AsmCode->subs);
+        pR700AsmCode->subs = NULL;
     }
     if(NULL != pR700AsmCode->callers)
     {
         FREE(pR700AsmCode->callers);
+        pR700AsmCode->callers = NULL;
     }
 
     if(NULL != pR700AsmCode->presubs)
     {
         FREE(pR700AsmCode->presubs);
+         pR700AsmCode->presubs = NULL;
     }
 
     return GL_TRUE;
diff --git a/src/mesa/drivers/dri/r600/r700_shader.c b/src/mesa/drivers/dri/r600/r700_shader.c
index 67b0d40..8b3ed5c 100644
--- a/src/mesa/drivers/dri/r600/r700_shader.c
+++ b/src/mesa/drivers/dri/r600/r700_shader.c
@@ -584,7 +584,11 @@ void cleanup_vfetch_shaderinst(R700_Shader *pShader)
 
 void Clean_Up_Shader(R700_Shader *pShader)
 {
-    FREE(pShader->pProgram);
+    if(NULL != pShader->pProgram)
+    {
+        FREE(pShader->pProgram);
+        pShader->pProgram = NULL;
+    }
 
     R700ShaderInstruction  *pInst;
     R700ShaderInstruction  *pInstToFree;
@@ -596,6 +600,8 @@ void Clean_Up_Shader(R700_Shader *pShader)
         pInst = pInst->pNextInst;
         FREE(pInstToFree);
     };
+    pShader->lstCFInstructions.pHead = NULL;
+
     pInst = pShader->lstALUInstructions.pHead;
     while(NULL != pInst)
     {
@@ -603,6 +609,8 @@ void Clean_Up_Shader(R700_Shader *pShader)
         pInst = pInst->pNextInst;
         FREE(pInstToFree);
     };
+    pShader->lstALUInstructions.pHead = NULL;
+
     pInst = pShader->lstTEXInstructions.pHead;
     while(NULL != pInst)
     {
@@ -610,6 +618,8 @@ void Clean_Up_Shader(R700_Shader *pShader)
         pInst = pInst->pNextInst;
         FREE(pInstToFree);
     };
+    pShader->lstTEXInstructions.pHead = NULL;
+
     pInst = pShader->lstVTXInstructions.pHead;
     while(NULL != pInst)
     {
@@ -617,5 +627,6 @@ void Clean_Up_Shader(R700_Shader *pShader)
         pInst = pInst->pNextInst;
         FREE(pInstToFree);
     };
+    pShader->lstVTXInstructions.pHead = NULL;
 }
 




More information about the mesa-commit mailing list