Просмотр исходного кода

Correction on clipper crash on some IFC files when points are empty

Arkeon 6 лет назад
Родитель
Сommit
b59d931486
1 измененных файлов с 8 добавлено и 2 удалено
  1. 8 2
      contrib/clipper/clipper.cpp

+ 8 - 2
contrib/clipper/clipper.cpp

@@ -371,6 +371,9 @@ inline bool PointsEqual( const IntPoint &pt1, const IntPoint &pt2)
 
 bool Orientation(OutRec *outRec, bool UseFullInt64Range)
 {
+  if (!outRec->pts)
+    return 0.0;
+
   //first make sure bottomPt is correctly assigned ...
   OutPt *opBottom = outRec->pts, *op = outRec->pts->next;
   while (op != outRec->pts)
@@ -434,6 +437,9 @@ double Area(const Polygon &poly)
 
 double Area(const OutRec &outRec, bool UseFullInt64Range)
 {
+  if (!outRec.pts)
+    return 0.0;
+
   OutPt *op = outRec.pts;
   if (UseFullInt64Range) {
     Int128 a(0);
@@ -3085,9 +3091,9 @@ void Clipper::JoinCommonEdges(bool fixHoleLinkages)
       FixupOutPolygon(*outRec1);
       FixupOutPolygon(*outRec2);
 
-      if (Orientation(outRec1, m_UseFullRange) != (Area(*outRec1, m_UseFullRange) > 0))
+      if (outRec1->pts && (Orientation(outRec1, m_UseFullRange) != (Area(*outRec1, m_UseFullRange) > 0)))
           DisposeBottomPt(*outRec1);
-      if (Orientation(outRec2, m_UseFullRange) != (Area(*outRec2, m_UseFullRange) > 0))
+      if (outRec2->pts && (Orientation(outRec2, m_UseFullRange) != (Area(*outRec2, m_UseFullRange) > 0)))
           DisposeBottomPt(*outRec2);
 
     } else