summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Maasikas <amaasikas@gmail.com>2010-09-02 11:09:52 +0300
committerAndre Maasikas <amaasikas@gmail.com>2010-09-02 13:04:13 +0300
commit651cf5fed776b7806e0e9aa02487c79704f3b009 (patch)
tree87a8254eedcfb525a80610be8ea5e74be132833d
parent333c27ca1cb52f16368d6a5500634e08b3fa332d (diff)
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
-rw-r--r--src/mesa/drivers/dri/r600/r700_assembler.c9
-rw-r--r--src/mesa/drivers/dri/r600/r700_shader.c13
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 9c5a5053d9..5d557f725a 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 67b0d40308..8b3ed5cd82 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;
}