Fix for [#36374] Read unitialized memory in Freestyle.
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 24 Aug 2013 11:42:00 +0000 (11:42 +0000)
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 24 Aug 2013 11:42:00 +0000 (11:42 +0000)
A variable keeping a bounding box was referenced after it was flagged as empty.

source/blender/freestyle/intern/application/Controller.cpp
source/blender/freestyle/intern/application/Controller.h
source/blender/freestyle/intern/geometry/BBox.h

index dbf3fa8349eae413f32e8ebefc8a56c130674332..c61f72295d2856ceedd48892f6c13a0c2052e171 100644 (file)
@@ -290,6 +290,8 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer *srl)
 
        _ListOfModels.push_back("Blender_models");
 
+       _Scene3dBBox = _RootNode->bbox();
+
        _bboxDiag = (_RootNode->bbox().getMax() - _RootNode->bbox().getMin()).norm();
        if (G.debug & G_DEBUG_FREESTYLE) {
                cout << "Triangles nb     : " << _SceneNumFaces << endl;
@@ -339,6 +341,7 @@ void Controller::DeleteWingedEdge()
 
        // clears the grid
        _Grid.clear();
+       _Scene3dBBox.clear();
        _SceneNumFaces = 0;
        _minEdgeSize = DBL_MAX;
 }
@@ -540,8 +543,8 @@ void Controller::ComputeViewMap()
        }
        _Chrono.start();
        // Build View Map
-       _ViewMap = vmBuilder.BuildViewMap(*_winged_edge, _VisibilityAlgo, _EPSILON, _RootNode->bbox(), _SceneNumFaces);
-       _ViewMap->setScene3dBBox(_RootNode->bbox());
+       _ViewMap = vmBuilder.BuildViewMap(*_winged_edge, _VisibilityAlgo, _EPSILON, _Scene3dBBox, _SceneNumFaces);
+       _ViewMap->setScene3dBBox(_Scene3dBBox);
 
        if (G.debug & G_DEBUG_FREESTYLE) {
                printf("ViewMap edge count : %i\n", _ViewMap->viewedges_size());
index d4537f5f987fbe3dfba7bd49a1db988bb1ee1f53..f5e50347d0fc9c7495c77434dc9ef5c0cff58577 100644 (file)
@@ -211,6 +211,7 @@ private:
        FastGrid _Grid;
        //HashGrid _Grid;
 
+       BBox<Vec3r> _Scene3dBBox;
        unsigned int _SceneNumFaces;
        real _minEdgeSize;
        real _EPSILON;
index 794ceba48e70a9fc1cd7fc087924827feb5ee3d5..afff36dec7bbaa618a499047a3fd9ebfffad09e6 100644 (file)
@@ -28,6 +28,8 @@
  *  \date 22/05/2003
  */
 
+#include "BLI_utildefines.h"
+
 #ifdef WITH_CXX_GUARDEDALLOC
 #include "MEM_guardedalloc.h"
 #endif
@@ -95,6 +97,7 @@ public:
 
        inline BBox<Point>& operator=(const BBox<Point>& b)
        {
+               BLI_assert(!b.empty());
                _min = b.getMin();
                _max = b.getMax();
                _empty = false;
@@ -103,6 +106,7 @@ public:
 
        inline BBox<Point>& operator+=(const BBox<Point>& b)
        {
+               BLI_assert(!b.empty());
                if (_empty) {
                        _min = b.getMin();
                        _max = b.getMax();