From 5748c36621f36a64cad29243dfe880291826059a Mon Sep 17 00:00:00 2001 From: raczman Date: Wed, 13 May 2009 13:22:43 +0200 Subject: Properly deallocate memory in tile assembler, and dereference memory when fread fails. --HG-- branch : trunk --- src/shared/vmap/TileAssembler.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src/shared/vmap/TileAssembler.cpp') diff --git a/src/shared/vmap/TileAssembler.cpp b/src/shared/vmap/TileAssembler.cpp index e6a1a6f448b..119e5de4538 100644 --- a/src/shared/vmap/TileAssembler.cpp +++ b/src/shared/vmap/TileAssembler.cpp @@ -416,57 +416,57 @@ namespace VMAP AABSPTree *gtree = new AABSPTree(); G3D::uint32 flags; - if(fread(&flags, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&flags, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } G3D::uint32 branches; - if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } - if(strcmp(blockId, "GRP ") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } - if(fread(&branches, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); delete gtree; return(false); } + if(strcmp(blockId, "GRP ") != 0) { fclose(rf); delete gtree; return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } + if(fread(&branches, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } for(int b=0;b<(int)branches; b++) { G3D::uint32 indexes; // indexes for each branch (not used jet) - if(fread(&indexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&indexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } } // ---- indexes - if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } - if(strcmp(blockId, "INDX") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); delete gtree; return(false); } + if(strcmp(blockId, "INDX") != 0) { fclose(rf); delete gtree; return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } unsigned int nindexes; if(fread(&nindexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } if(nindexes >0) { unsigned short *indexarray = new unsigned short[nindexes*sizeof(unsigned short)]; - if(fread(indexarray, sizeof(unsigned short), nindexes, rf) != nindexes) { fclose(rf); return(false); } + if(fread(indexarray, sizeof(unsigned short), nindexes, rf) != nindexes) { fclose(rf); delete gtree; delete[] indexarray; return(false); } for(int i=0;i<(int)nindexes; i++) { unsigned short val = indexarray[i]; tempIndexArray.append(val); } - delete indexarray; + delete[] indexarray; } // ---- vectors - if(fread(&blockId, 4, 1, rf) != 1) {fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) {fclose(rf); delete gtree; return(false); } if(strcmp(blockId, "VERT") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } unsigned int nvectors; - if(fread(&nvectors, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&nvectors, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } float *vectorarray = 0; if(nvectors >0) { vectorarray = new float[nvectors*sizeof(float)*3]; - if(fread(vectorarray, sizeof(float)*3, nvectors, rf) != nvectors) { fclose(rf); return(false); } + if(fread(vectorarray, sizeof(float)*3, nvectors, rf) != nvectors) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } } // ----- liquit if(flags & 1) { // we have liquit -> not handled yet ... skip - if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } - if(strcmp(blockId, "LIQU") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } + if(strcmp(blockId, "LIQU") != 0) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } fseek(rf, blocksize, SEEK_CUR); } -- cgit v1.2.3