From 7753416c5b6bdcc757983400c50c5cf878bc9caf Mon Sep 17 00:00:00 2001 From: Andre Maasikas Date: Thu, 2 Sep 2010 11:09:52 +0300 Subject: [PATCH] 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 9c5a5053d97..5d557f725ac 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 67b0d40308e..8b3ed5cd823 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; } -- 2.30.2