0024081: Memory corruption when projecting point on surface of revolution
authorRoman Lygin <roman.lygin@gmail.com>
Thu, 15 Aug 2013 11:55:13 +0000 (15:55 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 15 Aug 2013 13:23:50 +0000 (17:23 +0400)
Adding test cases for issue CR24081

src/Extrema/Extrema_ExtPRevS.cdl
src/Extrema/Extrema_ExtPRevS.cxx
tests/bugs/moddata_3/bug24081_1 [new file with mode: 0644]
tests/bugs/moddata_3/bug24081_2 [new file with mode: 0644]

index a44f638..1f4beda 100755 (executable)
@@ -105,7 +105,7 @@ fields
 
     myDone : Boolean;
     myNbExt: Integer;
-    mySqDist: Real [6];
-    myPoint: POnSurf from Extrema [6];
+    mySqDist: Real [8];
+    myPoint: POnSurf from Extrema [8];
 
 end ExtPRevS;
index f2beb94..203726c 100755 (executable)
@@ -174,7 +174,7 @@ static Standard_Boolean IsOriginalPnt (const gp_Pnt& P,
                                       const Standard_Integer NbPoints)
 {
   for (Standard_Integer i=1; i<=NbPoints; i++) {
-    if (Points[i].Value().IsEqual(P, Precision::Confusion())) {
+    if (Points[i-1].Value().IsEqual(P, Precision::Confusion())) {
       return Standard_False;
     }
   }
@@ -407,8 +407,9 @@ void Extrema_ExtPRevS::Perform(const gp_Pnt& P)
        Dist2 = P.SquareDistance(E);
       }
       if (IsOriginalPnt(E, myPoint, myNbExt)) {
-       myPoint[++myNbExt] = Extrema_POnSurf(U,V,E);
+       myPoint[myNbExt] = Extrema_POnSurf(U,V,E);
        mySqDist[myNbExt] = Dist2;
+       myNbExt++;
       }
     }
   }
@@ -476,9 +477,9 @@ void Extrema_ExtPRevS::Perform(const gp_Pnt& P)
        Dist2 = P.SquareDistance(E);
       }
       if (IsOriginalPnt(E, myPoint, myNbExt)) {
-       myPoint[++myNbExt] = Extrema_POnSurf(U,V,E);
+       myPoint[myNbExt] = Extrema_POnSurf(U,V,E);
        mySqDist[myNbExt] = Dist2;
-      
+       myNbExt++;
       }
     }
   }
@@ -518,7 +519,7 @@ Standard_Real Extrema_ExtPRevS::SquareDistance(const Standard_Integer N) const
   if (!IsDone()) { StdFail_NotDone::Raise(); }
   if ((N < 1) || (N > myNbExt)) { Standard_OutOfRange::Raise(); }
   if (myIsAnalyticallyComputable)
-    return mySqDist[N];
+    return mySqDist[N-1];
   else
     return myExtPS.SquareDistance(N);
 }
@@ -532,7 +533,7 @@ Extrema_POnSurf Extrema_ExtPRevS::Point(const Standard_Integer N) const
   if (!IsDone()) { StdFail_NotDone::Raise(); }
   if ((N < 1) || (N > myNbExt)) { Standard_OutOfRange::Raise(); }
   if (myIsAnalyticallyComputable)
-    return myPoint[N];
+    return myPoint[N-1];
   else
     return myExtPS.Point(N);
 }
diff --git a/tests/bugs/moddata_3/bug24081_1 b/tests/bugs/moddata_3/bug24081_1
new file mode 100644 (file)
index 0000000..986ac71
--- /dev/null
@@ -0,0 +1,11 @@
+puts "================"
+puts "CR24081"
+puts "================"
+puts ""
+#######################################################################
+# Memory corruption when projecting point on surface of revolution
+#######################################################################
+
+ellipse e 10 0 0 0 -1 0 0 0 1 5 2
+revsurf s e 0 0 0 0 0 1
+proj s 7.9 0 0
diff --git a/tests/bugs/moddata_3/bug24081_2 b/tests/bugs/moddata_3/bug24081_2
new file mode 100644 (file)
index 0000000..0bcc38d
--- /dev/null
@@ -0,0 +1,11 @@
+puts "================"
+puts "CR24081"
+puts "================"
+puts ""
+#######################################################################
+# Memory corruption when projecting point on surface of revolution
+#######################################################################
+
+ellipse e 2.1 0 0 0 -1 0 0 0 1 5 2
+revsurf s e 0 0 0 0 0 1
+proj s 0.01 0 0