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