Bug 13435 fixed: Crash under Windows when xmlRemove on the first child 15/14615/3
Calixte DENIZET [Wed, 4 Jun 2014 14:46:23 +0000 (16:46 +0200)]
Change-Id: I9f72c8651d0eb97f6b3cec8f46c7c1e46ed9d033

scilab/CHANGES_5.5.X
scilab/modules/xml/src/cpp/XMLElement.cpp
scilab/modules/xml/tests/nonreg_tests/bug_13435.dia.ref [new file with mode: 0644]
scilab/modules/xml/tests/nonreg_tests/bug_13435.tst [new file with mode: 0644]

index 16cbeb9..66df3cc 100644 (file)
@@ -89,6 +89,7 @@ Scilab Bug Fixes
 * Bug #13409 fixed - permute(x, dims) failed when dims was greater than the dimensions of size(x)
                      now permute treats extra dimensions as 1
 
+* Bug #13435 fixed - Windows version crashes when calling xmlRemove on the first child.
 
 
 Xcos Bug Fixes
@@ -109,9 +110,9 @@ Xcos Bug Fixes
 
 * Bug #13385 fixed - TOWS_c and FROMWSB Xcos blocs needed better examples on how
                      to get or write a Scilab variable.
-                     
+
 * Bug #13391 fixed - scifunc_block_m help page was not clear about the block using.
-                     Example has been added.  
+                     Example has been added.
 
 * Bug #13396 fixed - MBLOCK did not work with an external file containing the modelica class.
 
index eb48807..e06f972 100644 (file)
@@ -60,6 +60,13 @@ void XMLElement::remove() const
     if (node->parent && node->parent->children)
     {
         obj = scope->getXMLNodeListFromLibXMLPtr(node->parent->children);
+        if (obj && node->parent->children == node)
+        {
+            // node->parent->children == node => we remove the first child so parent->children
+            // needs to be correctly re-linked.
+            obj->removeElementAtPosition(1);
+            return;
+        }
     }
 
     xmlUnlinkNode(node);
diff --git a/scilab/modules/xml/tests/nonreg_tests/bug_13435.dia.ref b/scilab/modules/xml/tests/nonreg_tests/bug_13435.dia.ref
new file mode 100644 (file)
index 0000000..e87c791
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13435 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13435
+//
+// <-- Short Description -->
+// Crash under Windows when xmlRemove on the first child
+//
+doc = xmlReadStr("<root><a>Hello</a><b>Scilab</b><a>World</a></root>");
+c = doc.root.children;
+assert_checkequal(3, c.size);
+xmlRemove(doc.root.children(1));
+assert_checkequal(2, c.size);
+xmlDelete(doc)
diff --git a/scilab/modules/xml/tests/nonreg_tests/bug_13435.tst b/scilab/modules/xml/tests/nonreg_tests/bug_13435.tst
new file mode 100644 (file)
index 0000000..347ee19
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13435 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13435
+//
+// <-- Short Description -->
+// Crash under Windows when xmlRemove on the first child
+//
+
+doc = xmlReadStr("<root><a>Hello</a><b>Scilab</b><a>World</a></root>");
+c = doc.root.children;
+assert_checkequal(3, c.size);
+xmlRemove(doc.root.children(1));
+assert_checkequal(2, c.size);
+
+xmlDelete(doc)