0028714: XmlMFunction_ScopeDriver fail to read and write function label including...
authormpv <mpv@opencascade.com>
Mon, 29 May 2017 09:16:56 +0000 (12:16 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 1 Jun 2017 10:55:26 +0000 (13:55 +0300)
Reproduced on TDF_Reference attribute that refers to label with zero-tags entry. Make checking of saved/retrieved tags in XML format pass zero-tags as correct.

src/XmlObjMgt/XmlObjMgt.cxx
tests/bugs/caf/bug27187 [new file with mode: 0644]

index 7d8a67f..5544f22 100644 (file)
@@ -190,10 +190,10 @@ Standard_Boolean XmlObjMgt::GetTagEntryString
     errno = 0;
     char * aPtr;
     long aTagValue = strtol (&aSource[1], &aPtr, 10);
-    if (aTagValue <= 0 || aPtr[0] != aQuote ||
+    Standard_Integer aLen = (Standard_Integer)(aPtr - &aSource[1]);
+    if (aTagValue < 0 || aLen == 0 || aPtr[0] != aQuote ||
         errno == ERANGE || errno == EINVAL)
       return Standard_False;
-    Standard_Integer aLen = (Standard_Integer)(aPtr - &aSource[1]);
     aTagEntryPtr[0] = ':';
     memcpy (&aTagEntryPtr[1], &aSource[1], aLen);
     aTagEntryPtr += (aLen + 1);
@@ -246,9 +246,10 @@ void XmlObjMgt::SetTagEntryString (XmlObjMgt_DOMString&           theTarget,
     errno = 0;
     char * ptr;
     long aTagValue = strtol (aTagEntry, &ptr, 10);
-    if (aTagValue <= 0 || errno == ERANGE || errno == EINVAL)
-      return;           // error
     Standard_Integer aTagSize = (Standard_Integer)(ptr - aTagEntry);
+    if (aTagValue < 0 || aTagSize == 0 ||
+        errno == ERANGE || errno == EINVAL)
+      return;           // error
 
     //  Add one XPath level to the expression in aTarget
     memcpy (&aTargetPtr[0],                     aRefElem1, anElem1Size);
diff --git a/tests/bugs/caf/bug27187 b/tests/bugs/caf/bug27187
new file mode 100644 (file)
index 0000000..fcf59c0
--- /dev/null
@@ -0,0 +1,24 @@
+puts "==========="
+puts "OCC27187"
+puts "==========="
+puts ""
+#################################
+# XmlMFunction_ScopeDriver fail to read and write function label including 0 tag in label path.
+#################################
+
+NewDocument Doc XmlOcaf
+# label that contains "0" tag not only in "Root"
+set Lab 0:1:4:9999:0:1:4:2001:4:2001:4:1:4:1001:4:1001
+Label Doc $Lab
+SetReference Doc 0:1 $Lab
+
+set aFileName ${imagedir}/${casename}_doc.xml
+SaveAs Doc ${aFileName}
+Close Doc
+
+# check that the reference is correctly restored
+Open ${aFileName} Doc
+if {[GetReference Doc 0:1] != $Lab} {
+   puts "Error: restored Reference attribute value is bad '[GetReference Doc 0:1]'"
+}
+Close Doc