[7858] Properly deallocate memory in tile assembler, and dereference memory when fread fails.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>

Thanks to ANTOMA for prepering patch to mangos.
I also change code to more nice view using temporary defines.
This commit is contained in:
raczman 2009-05-20 15:36:02 +04:00 committed by VladimirMangos
parent 1dbadb6ff0
commit a6d4d733b5
2 changed files with 48 additions and 25 deletions

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7857" #define REVISION_NR "7858"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__

View file

@ -377,9 +377,13 @@ namespace VMAP
int endgroup = INT_MAX; int endgroup = INT_MAX;
#endif #endif
// temporary use defines to simplify read/check code (close file and return at fail)
#define READ_OR_RETURN(V,S) if(fread((V), (S), 1, rf) != 1) { fclose(rf); return(false); }
#define CMP_OR_RETURN(V,S) if(strcmp((V),(S)) != 0) { fclose(rf); return(false); }
if(rf) if(rf)
{ {
if(fread(&ident, 8, 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&ident, 8);
if(strcmp(ident, "VMAP001") == 0) if(strcmp(ident, "VMAP001") == 0)
{ {
// OK, do nothing // OK, do nothing
@ -388,7 +392,7 @@ namespace VMAP
{ {
// we have to read one int. This is needed during the export and we have to skip it here // we have to read one int. This is needed during the export and we have to skip it here
int tempNVectors; int tempNVectors;
if(fread(&tempNVectors, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&tempNVectors, sizeof(int));
} }
else else
@ -402,7 +406,7 @@ namespace VMAP
blockId[4] = 0; blockId[4] = 0;
int blocksize; int blocksize;
if(fread(&groups, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&groups, sizeof(G3D::uint32));
for(int g=0;g<(int)groups;g++) for(int g=0;g<(int)groups;g++)
{ {
@ -412,61 +416,76 @@ namespace VMAP
AABSPTree<Triangle> *gtree = new AABSPTree<Triangle>(); AABSPTree<Triangle> *gtree = new AABSPTree<Triangle>();
// add free gtree at fail
#undef READ_OR_RETURN
#undef CMP_OR_RETURN
#define READ_OR_RETURN(V,S) if(fread((V), (S), 1, rf) != 1) { fclose(rf); delete gtree; return(false); }
#define CMP_OR_RETURN(V,S) if(strcmp((V),(S)) != 0) { fclose(rf); delete gtree; return(false); }
G3D::uint32 flags; G3D::uint32 flags;
if(fread(&flags, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&flags, sizeof(G3D::uint32));
G3D::uint32 branches; G3D::uint32 branches;
if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blockId, 4);
if(strcmp(blockId, "GRP ") != 0) { fclose(rf); return(false); } CMP_OR_RETURN(blockId, "GRP ");
if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blocksize, sizeof(int));
if(fread(&branches, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&branches, sizeof(G3D::uint32));
for(int b=0;b<(int)branches; b++) for(int b=0;b<(int)branches; b++)
{ {
G3D::uint32 indexes; G3D::uint32 indexes;
// indexes for each branch (not used jet) // indexes for each branch (not used jet)
if(fread(&indexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&indexes, sizeof(G3D::uint32));
} }
// ---- indexes // ---- indexes
if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blockId, 4);
if(strcmp(blockId, "INDX") != 0) { fclose(rf); return(false); } CMP_OR_RETURN(blockId, "INDX");
if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blocksize, sizeof(int));
unsigned int nindexes; unsigned int nindexes;
if(fread(&nindexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&nindexes, sizeof(G3D::uint32));
if(nindexes >0) if(nindexes >0)
{ {
unsigned short *indexarray = new unsigned short[nindexes*sizeof(unsigned short)]; unsigned short *indexarray = new unsigned short[nindexes*sizeof(unsigned short)];
if(fread(indexarray, sizeof(unsigned short), nindexes, rf) != nindexes) { fclose(rf); return(false); } READ_OR_RETURN(indexarray, sizeof(unsigned short));
for(int i=0;i<(int)nindexes; i++) for(int i=0;i<(int)nindexes; i++)
{ {
unsigned short val = indexarray[i]; unsigned short val = indexarray[i];
tempIndexArray.append(val); tempIndexArray.append(val);
} }
delete indexarray; delete[] indexarray;
} }
// ---- vectors // ---- vectors
if(fread(&blockId, 4, 1, rf) != 1) {fclose(rf); return(false); } READ_OR_RETURN(&blockId, 4);
if(strcmp(blockId, "VERT") != 0) { fclose(rf); return(false); } CMP_OR_RETURN(blockId, "VERT");
if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blocksize, sizeof(int));
unsigned int nvectors; unsigned int nvectors;
if(fread(&nvectors, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&nvectors, sizeof(int));
float *vectorarray = 0; float *vectorarray = 0;
// add vectorarray free
#undef READ_OR_RETURN
#undef CMP_OR_RETURN
#define READ_OR_RETURN(V,S) if(fread((V), (S), 1, rf) != 1) { fclose(rf); delete gtree; delete[] vectorarray; return(false); }
#define CMP_OR_RETURN(V,S) if(strcmp((V),(S)) != 0) { fclose(rf); delete gtree; delete[] vectorarray; return(false); }
if(nvectors >0) if(nvectors >0)
{ {
vectorarray = new float[nvectors*sizeof(float)*3]; vectorarray = new float[nvectors*sizeof(float)*3];
if(fread(vectorarray, sizeof(float)*3, nvectors, rf) != nvectors) { fclose(rf); return(false); } READ_OR_RETURN(vectorarray, sizeof(float)*3);
} }
// ----- liquit // ----- liquit
if(flags & 1) if(flags & 1)
{ {
// we have liquit -> not handled yet ... skip // we have liquit -> not handled yet ... skip
if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blockId, 4);
if(strcmp(blockId, "LIQU") != 0) { fclose(rf); return(false); } CMP_OR_RETURN(blockId, "LIQU");
if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } READ_OR_RETURN(&blocksize, sizeof(int));
fseek(rf, blocksize, SEEK_CUR); fseek(rf, blocksize, SEEK_CUR);
} }
for(unsigned int i=0, indexNo=0; indexNo<nvectors; indexNo++) for(unsigned int i=0, indexNo=0; indexNo<nvectors; indexNo++)
{ {
Vector3 v = Vector3(vectorarray[i+2], vectorarray[i+1], vectorarray[i+0]); Vector3 v = Vector3(vectorarray[i+2], vectorarray[i+1], vectorarray[i+0]);
@ -498,6 +517,10 @@ namespace VMAP
} }
} }
// drop of temporary use defines
#undef READ_OR_RETURN
#undef CMP_OR_RETURN
if(vectorarray != 0) if(vectorarray != 0)
{ {
delete vectorarray; delete vectorarray;