Fix #29381: Navmeshs frees not guarded allocated memory and leaked
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 2 Feb 2012 08:48:43 +0000 (08:48 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 2 Feb 2012 08:48:43 +0000 (08:48 +0000)
There were two issues discovered:
- Triangles mapping didn't free in buildNavMeshData if there's no recast data for an object
- KX_NavMeshObject used not-guarded allocation for polygons storage, but used guarded
  freeing stuff to free used memory, producing error messages in the console and leading to
  memory leak.

Wasn't actually harmful for users -- there was no memory corruptions and error happens only
when object was set up in a way when navmesh can't work in theory.

source/blender/blenkernel/intern/navmesh_conversion.c
source/gameengine/Ketsji/KX_NavMeshObject.cpp

index e3b5b83964e9f540e77fa51297a744d31a02a332..e6749730fc990f8952869343197a175e31accc09 100644 (file)
@@ -344,7 +344,7 @@ int buildNavMeshData(const int nverts, const float* verts,
                                                         int *vertsPerPoly_r, int **dtrisToPolysMap_r, int **dtrisToTrisMap_r)
 
 {
-       int *trisMapping = MEM_callocN(sizeof(int)*ntris, "buildNavMeshData trisMapping");
+       int *trisMapping;
        int i;
        struct SortContext context;
        int validTriStart, prevPolyIdx, curPolyIdx, newPolyIdx, prevpolyidx;
@@ -360,6 +360,8 @@ int buildNavMeshData(const int nverts, const float* verts,
                return 0;
        }
 
+       trisMapping = MEM_callocN(sizeof(int)*ntris, "buildNavMeshData trisMapping");
+
        //sort the triangles by polygon idx
        for (i=0; i<ntris; i++)
                trisMapping[i]=i;
index 6765f07b34454acb0ebcbd359086e600d8fa60db..f92319e508ba4d6808e88c75691da79b826e2acb 100644 (file)
@@ -248,7 +248,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts,
                }
 
                //create tris
-               polys = new unsigned short[npolys*3*2];
+               polys = (unsigned short*)MEM_callocN(sizeof(unsigned short)*3*2*npolys, "BuildVertIndArrays polys");
                memset(polys, 0xff, sizeof(unsigned short)*3*2*npolys);
                unsigned short *poly = polys;
                RAS_Polygon* raspoly;