OSDN Git Service

r600: protect cleanup instructions from double free
authorAndre Maasikas <amaasikas@gmail.com>
Thu, 2 Sep 2010 08:09:52 +0000 (11:09 +0300)
committerAndre Maasikas <amaasikas@gmail.com>
Thu, 9 Sep 2010 08:08:11 +0000 (11:08 +0300)
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
src/mesa/drivers/dri/r600/r700_shader.c

index 9c5a505..5d557f7 100644 (file)
@@ -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;
index 67b0d40..8b3ed5c 100644 (file)
@@ -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;
 }