XML: remove memory leaks 09/6009/3
Calixte DENIZET [Mon, 23 Jan 2012 14:12:46 +0000 (15:12 +0100)]
Change-Id: I4409b062f111074569f26371618a58a9f9cb53f9

scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_e.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlAsNumber.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlAsText.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlXPath.cpp
scilab/modules/xml/src/cpp/XMLDocument.cpp
scilab/modules/xml/src/cpp/XMLNodeSet.cpp

index 5b9253d..735391c 100644 (file)
@@ -110,6 +110,11 @@ int sci_percent_XMLList_e(char * fname, unsigned long fname_len)
             pstStrings = list->getContentFromList();
 
             err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, list->getSize(), const_cast<const char * const *>(pstStrings));
+            // contents are created with xmlGetNodeContent which requires that the user free the himself the memory
+            for (int i = 0; i < list->getSize(); i++)
+            {
+                xmlFree(const_cast<char *>(pstStrings[i]));
+            }
             delete[] pstStrings;
             if (err.iErr)
             {
index d341ec3..6167278 100644 (file)
@@ -67,6 +67,7 @@ int sci_xmlAsNumber(char * fname, unsigned long fname_len)
     {
         stringToDoubleError convErr = STRINGTODOUBLE_NO_ERROR;
         pdblReal[i] = stringToDouble(contents[i], TRUE, &convErr);
+        xmlFree(const_cast<char *>(contents[i]));
     }
 
     delete[] contents;
index 6904637..088d2d9 100644 (file)
@@ -62,6 +62,10 @@ int sci_xmlAsText(char * fname, unsigned long fname_len)
     pstStrings = list->getContentFromList();
 
     err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, list->getSize(), const_cast<const char * const *>(pstStrings));
+    for (int i = 0; i < list->getSize(); i++)
+    {
+        xmlFree(const_cast<char *>(pstStrings[i]));
+    }
     delete[] pstStrings;
     if (err.iErr)
     {
index 8284e36..f2622c1 100644 (file)
@@ -45,6 +45,7 @@ int sci_xmlXPath(char * fname, unsigned long fname_len)
     int col = 0;
     char ** namespaces = 0;
     int isElem = 0;
+    bool mustDelete = true;
 
     CheckLhs(1, 1);
     CheckRhs(2, 3);
@@ -161,6 +162,7 @@ int sci_xmlXPath(char * fname, unsigned long fname_len)
             createMatrixOfDouble(pvApiCtx, Rhs + 1, 0, 0, 0);
         }
         set->createOnStack(Rhs + 1, pvApiCtx);
+        mustDelete = false;
         break;
     }
     case XPATH_BOOLEAN :
@@ -187,7 +189,16 @@ int sci_xmlXPath(char * fname, unsigned long fname_len)
         return 0;
     }
 
-    delete xpath;
+    if (mustDelete)
+    {
+        xmlXPathObject * real = static_cast<xmlXPathObject *>(xpath->getRealXMLPointer());
+        delete xpath;
+        xmlXPathFreeObject(real);
+    }
+    else
+    {
+        delete xpath;
+    }
 
     LhsVar(1) = Rhs + 1;
     PutLhsVar();
index c572164..2db72e3 100644 (file)
@@ -157,6 +157,7 @@ namespace org_modules_xml
         xmlXPathObject * xpath = xmlXPathCompiledEval(expr, ctxt);
         xmlSetStructuredErrorFunc(ctxt, 0);
         xmlXPathFreeContext(ctxt);
+        xmlXPathFreeCompExpr(expr);
         if (!xpath)
         {
             *error = *errorXPathBuffer;
index ae8a13a..012a2b1 100644 (file)
@@ -44,6 +44,7 @@ namespace org_modules_xml
     {
         scope->unregisterPointer(nodeSet);
         scope->removeId(id);
+        xmlXPathFreeObject(xpath);
     }
 
     void * XMLNodeSet::getRealXMLPointer() const