0025537: XmlMPrsStd_PositionDriver::Paste runtime check crash.
authormpv <mpv@opencascade.com>
Mon, 22 May 2017 11:35:57 +0000 (14:35 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 26 May 2017 11:51:23 +0000 (14:51 +0300)
Increased a size of buffer in array of 'char' to fit the largest possible conversion from 'double' to %.17g string.

src/XmlMDataXtd/XmlMDataXtd_PositionDriver.cxx
src/XmlMXCAFDoc/XmlMXCAFDoc_CentroidDriver.cxx
src/XmlObjMgt/XmlObjMgt_GP.cxx
tests/bugs/caf/bug25537 [new file with mode: 0644]

index 60aaa10..2117364 100644 (file)
@@ -122,7 +122,7 @@ void XmlMDataXtd_PositionDriver::Paste
   if (!aTPos.IsNull())
   {
     gp_Pnt aPos = aTPos->GetPosition();
-    char buf [64];
+    char buf [75]; // (24 + 1) * 3
     Sprintf (buf, "%.17g %.17g %.17g", aPos.X(), aPos.Y(), aPos.Z());
     XmlObjMgt::SetStringValue(theTarget.Element(), buf);
   }
index 0166afa..100a917 100644 (file)
@@ -121,7 +121,7 @@ void XmlMXCAFDoc_CentroidDriver::Paste
   if (!aTPos.IsNull())
   {
     gp_Pnt aPos = aTPos->Get();
-    char buf [64];
+    char buf[75]; // (24 + 1) * 3
     Sprintf (buf, "%.17g %.17g %.17g", aPos.X(), aPos.Y(), aPos.Z());
     XmlObjMgt::SetStringValue(theTarget.Element(), buf);
   }
index 1a6e560..ddb9db0 100644 (file)
@@ -61,7 +61,7 @@ XmlObjMgt_DOMString XmlObjMgt_GP::Translate (const gp_Mat& aMat)
 //=======================================================================
 XmlObjMgt_DOMString XmlObjMgt_GP::Translate (const gp_XYZ& anXYZ)
 {
-  char buf [64];
+  char buf [75]; // (24 + 1) * 3
   Sprintf (buf, "%.17g %.17g %.17g", anXYZ.X(), anXYZ.Y(), anXYZ.Z());
   return XmlObjMgt_DOMString (buf);
 }
diff --git a/tests/bugs/caf/bug25537 b/tests/bugs/caf/bug25537
new file mode 100644 (file)
index 0000000..1da77c1
--- /dev/null
@@ -0,0 +1,29 @@
+puts "============"
+puts "OCC25537"
+puts "============"
+puts ""
+#######################################################################
+# XmlMPrsStd_PositionDriver::Paste runtime check crash.
+#######################################################################
+pload XDEDRAW
+
+NewDocument Doc XmlXCAF
+
+# number that takes 24 symbols in %.17g string
+set aBigNum -0.0000000000123456789123456789
+
+# Create TDataXtd_Position and XCAFDoc_Centroid attributes (same problem in writing XML)
+# 100 labels to have a stable exception (memory corruption)
+for {set i 1} {$i < 100} {incr i} {
+  set aLab1 0:1:$i
+  SetPosition Doc $aLab1 $aBigNum $aBigNum $aBigNum
+  set aLab2 0:2:$i
+  Label Doc $aLab2
+  XSetCentroid Doc $aLab2 $aBigNum $aBigNum $aBigNum
+}
+
+set aFile ${imagedir}/bug25537_test.xml
+SaveAs Doc ${aFile}
+
+## ==> No exception
+Close Doc