Prefs: fix (?) bug when saving cwd 54/13954/2
Calixte DENIZET [Fri, 7 Mar 2014 15:50:22 +0000 (16:50 +0100)]
Change-Id: I7d7fbf821f34ec8193ff47c037b98f67c5705e4d

scilab/modules/core/src/c/saveCWDInPreferences.c
scilab/modules/preferences/src/c/getScilabPreference.c

index 71989e5..5b5bf1c 100644 (file)
@@ -29,7 +29,7 @@ void saveCWDInPreferences()
             int err;
             char * cwd = scigetcwd(&err);
 
-            if (!err && cwd && strcmp(cwd, values[1]))
+            if (!err && cwd && values[1] && strcmp(cwd, values[1]))
             {
                 const char * kv[] = {"previous", cwd};
                 setPrefAttributesValues("//general/body/startup", kv, sizeof(kv) / sizeof(const char *));
@@ -40,8 +40,14 @@ void saveCWDInPreferences()
                 FREE(cwd);
             }
         }
-        FREE(values[0]);
-        FREE(values[1]);
+        if (values[0])
+        {
+            FREE(values[0]);
+        }
+        if (values[1])
+        {
+            FREE(values[1]);
+        }
         FREE(values);
     }
 }
index 2e11d88..13f6a0e 100644 (file)
@@ -200,6 +200,8 @@ void getDocAndCtxt(xmlDocPtr * doc, xmlXPathContextPtr * xpathCtxt)
     BOOL bConvert = FALSE;
     char * shortfilename_xml_conf = NULL;
     char * ret = NULL;
+    *doc = NULL;
+    *xpathCtxt = NULL;
 
     SCIHOME = getSCIHOME();
     path = (char *)MALLOC(strlen(SCIHOME) + strlen(XCONF));
@@ -298,27 +300,36 @@ char ** getPrefAttributesValues(const char * xpath, const char ** attributes, co
     }
 
     getDocAndCtxt(&doc, &xpathCtxt);
-    if (doc == NULL)
+    if (doc == NULL || xpathCtxt == NULL)
     {
         return NULL;
     }
 
-    ret = (char**)MALLOC(sizeof(char*) * attrLen);
     xpathObj = xmlXPathEval((const xmlChar*)xpath, xpathCtxt);
     if (xpathObj && xpathObj->nodesetval && xpathObj->nodesetval->nodeMax)
     {
-        int i;
+        unsigned int i;
         xmlNode * node = (xmlNode*)xpathObj->nodesetval->nodeTab[0];
-        for (i = 0; i < (int)attrLen; i++)
+        ret = (char**)MALLOC(sizeof(char*) * attrLen);
+        if (!ret)
+        {
+            xmlXPathFreeObject(xpathObj);
+            xmlXPathFreeContext(xpathCtxt);
+            xmlFreeDoc(doc);
+            return NULL;
+        }
+
+        for (i = 0; i < attrLen; i++)
         {
             xmlAttr * attrs = xmlHasProp(node, (const xmlChar *)attributes[i]);
             if (attrs)
             {
                 ret[i] = strdup((const char *)attrs->children->content);
             }
-            else
+
+            if (!attrs || !ret[i])
             {
-                int j;
+                unsigned int j;
                 for (j = 0; j < i; j++)
                 {
                     free(ret[j]);